% \iffalse meta-comment
%
% Copyright (C) 2015-2020 by Zeping Lee <zepinglee AT gmail.com>
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
%<*internal>
\iffalse
\fi
\begingroup
  \def\nameoflatex{LaTeX2e}
\expandafter\endgroup\ifx\nameoflatex\fmtname\else
\csname fi\endcsname
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\nopreamble
\nopostamble
\generate{
  \file{\jobname.cls}{\from{\jobname.dtx}{class}}
}
\endbatchfile
%</install>
%<*internal>
\fi
%</internal>
%<*driver>
\ProvidesFile{ustcthesis.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
%<class>\ProvidesClass{ustcthesis}
%<*class>
  [2020/01/01 v3.2 USTC thesis template]
%</class>
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[UTF8]{ctex}
\usepackage{unicode-math}
\usepackage{caption}
\usepackage{booktabs}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{hypdoc}

\makeatletter

% 设置字体
\IfFileExists{/System/Library/Fonts/Times.ttc}{
  \setmainfont{Times}
  \setsansfont[Scale=MatchLowercase]{Helvetica}
  \setmonofont[Scale=MatchLowercase]{Menlo}
  \xeCJKsetwidth{‘’“”}{1em}
}{}
\unimathsetup{
  math-style=ISO,
  bold-style=ISO,
}
\IfFontExistsTF{xits-math.otf}{
  \setmathfont[
    Extension    = .otf,
    BoldFont     = *bold,
    StylisticSet = 8,
  ]{xits-math}
  \setmathfont[range={cal,bfcal},StylisticSet=1]{xits-math.otf}
}{
  \setmathfont[
    Extension    = .otf,
    BoldFont     = XITSMath-Bold,
    StylisticSet = 8,
  ]{XITSMath-Regular}
  \setmathfont[range={cal,bfcal},StylisticSet=1]{XITSMath-Regular.otf}
}

% 定义一些命令用于写文档
\newcommand\TeXLive{\TeX{} Live}
\newcommand\unicodechar[1]{U+#1（\symbol{"#1}）}
\DeclareRobustCommand\file{\nolinkurl}
\DeclareRobustCommand\env{\texttt}
\DeclareRobustCommand\pkg{\textsf}
\DeclareRobustCommand\cls{\textsf}
\DeclareRobustCommand\opt{\texttt}

% 在 doc 的基础上增加 option 的描述
\def\DescribeOption{\leavevmode\@bsphack\begingroup\MakePrivateLetters
  \Describe@Option}
\def\Describe@Option#1{\endgroup
              \marginpar{\raggedleft\PrintDescribeOption{#1}}%
              \SpecialEnvIndex{#1}\@esphack\ignorespaces}
\@ifundefined{PrintDescribeOption}
   {\def\PrintDescribeOption#1{\strut \MacroFont #1\ }}{}

% 调整列表的格式
\setlength\partopsep{\z@}
\def\@listi{\leftmargin\leftmargini
            \parsep \z@
            \topsep 5\p@ \@plus2\p@ \@minus3\p@
            \itemsep2\p@ \@plus\p@ \@minus\p@}
\let\@listI\@listi
\@listi

% listings 的样式
\lstdefinestyle{lstshell}{
  basicstyle      = \small\ttfamily,
  backgroundcolor = \color{lightgray},
  language        = bash,
}
\newcommand\shellcmd[1]{\colorbox{lightgray}{\lstinline[style=lstshell]|#1|}}
\lstnewenvironment{shell}{\lstset{style=lstshell, gobble=4}}{}
\lstnewenvironment{latex}{%
  \lstset{
    basicstyle = \small\ttfamily,
    frame      = single,
    gobble     = 4,
    language   = [LaTeX]TeX,
  }%
}{}

\hypersetup{
  allcolors         = blue,
  bookmarksnumbered = true,
  bookmarksopen     = true,
}
\makeatother

\EnableCrossrefs
% \OnlyDescription

\begin{document}
  \DocInput{\jobname.dtx}
  \clearpage
\end{document}
%</driver>
% \fi
%
% \DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
% \DoNotIndex{\if,\ifnum,\ifdim,\ifcat,\ifmmode,\ifvmode,\ifhmode,%
%             \iftrue,\iffalse,\ifvoid,\ifx,\ifeof,\ifcase,\else,\or,\fi}
% \DoNotIndex{\begin,\end,\bgroup,\egroup,\begingroup,\endgroup}
% \DoNotIndex{\expandafter,\csname,\endcsname}
% \DoNotIndex{\hsize,\vsize,\hskip,\vskip,\kern,\hfil,\hfill,\hss}
% \DoNotIndex{\hspace,\vspace}
% \DoNotIndex{\p@,\m@ne,\z@,\@ne,\tw@,\@plus,\@minus}
% \DoNotIndex{\newcounter,\setcounter,\addtocounter,}
% \DoNotIndex{\newdim,\newlength,\setlength,\addtolength}
% \DoNotIndex{\newcommand,\renewcommand,\providecommand,\DeclareRobustCommand}
% \DoNotIndex{\newenvironment,\renewenvironment}
% \DoNotIndex{\RequirePackage,\LoadClass,\ProvidesClass}
% \DoNotIndex{\DeclareOption,\CurrentOption,\ExecuteOptions,\ProcessOptions}
% \DoNotIndex{\rmfamily,\sffamily,\ttfamily,\bfseries,\mdseries,\itshape,%
%             \textrm,\textsf,\texttt,\textbf,\textmd,\textit,\textsl,\textsc}
% \DoNotIndex{\iint,\iiint,\iiiint,\oint,\oiint,\oiiint,%
%             \intclockwise,\varointclockwise,\ointctrclockwise,\sumint,%
%             \intbar,\intBar,\fint,\cirfnint,\awint,\rppolint,%
%             \scpolint,\npolint,\pointint,\sqint,\intlarhk,\intx,%
%             \intcap,\intcup,\upint,\lowint}
% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,%
%             \m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z,%
%             \A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,%
%             \M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,%
%             \do\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ ,\,,\!,\',\",\/,\*,\-}
% \DoNotIndex{\NAT@@close,\NAT@@open,\NAT@cite,\NAT@citenum,\NAT@citesuper,%
%             \NAT@citex,\NAT@citexnum,\NAT@cmt,\NAT@ctype,\NAT@date,%
%             \NAT@last@yr,\NAT@mbox,\NAT@penalty,\NAT@spacechar,%
%             \@citea,\def@NAT@last@yr,\ifNAT@swa}
% \DoNotIndex{\quad,\par,\relax,\ccwd}
% \DoNotIndex{\bp@}
%
%
%
% \GetFileInfo{\jobname.dtx}
%
% \title{\cls{ustcthesis} 使用说明}
% \author{Zeping Lee\thanks{zepinglee AT gmail.com} \and
%         seisman\thanks{seisman.info AT gmail.com} }
% \date{\filedate\qquad\fileversion}
% \maketitle
%
%
%
% \section{简介}
%
% 本模板 \cls{ustcthesis} 是中国科学技术大学本科生和研究生学位论文的 \LaTeX{}
% 模板， 按照《\href{http://gradschool.ustc.edu.cn/ylb/material/xw/wdxz/32.pdf}
% {中国科学技术大学研究生学位论文撰写手册}》和
% 《\href{http://www.teach.ustc.edu.cn/document/doc-administration/4032.html}
% {关于本科毕业论文（设计）格式和统一封面的通知}》的要求编写。
%
% 其前身是中国科学技术大学本科论文模板（作者 XPS，最后维护 ywg）
% 和中国科学技术大学研究生论文模板（作者 Liuqs，主要维护 Liuqs、Guolicai）。
% 后来两模板进行了整合梳理，由 ywg 维护。
% 2015 年，seisman 和 zepinglee 基于 \pkg{ctex} 2.0 重新编写了模板。
% 2017 年，随着学校发布了新版的《撰写手册》，本模板也更新到 v3.0。
%
% 下载地址：
% \begin{itemize}
%   \item 主要地址：\url{https://github.com/ustctug/ustcthesis/releases}
%   \item 学校镜像：\url{https://git.lug.ustc.edu.cn/ustctug/ustcthesis}
%   \item 研究生院网站（版本较旧）：
%     \url{http://gradschool.ustc.edu.cn/ylb/xw.html}
% \end{itemize}
%
% 用户在使用 \pkg{ustcthesis} 模板前，应先阅读学校的《撰写手册》等规范。
% 如果在使用的过程中遇到问题，可以阅读
% \href{https://github.com/ustctug/ustcthesis/wiki}{常见问题}，
% 或者在 \href{https://github.com/ustctug/ustcthesis/issues}{GitHub Issues}
% 中反馈。
%
%
%
% \section{编译方法}
%
%
% \subsection{文件组成}
% 本模板的主要文件如表~\ref{tab:files}：
% \begin{table}[htb]
%   \centering\small
%   \caption{模板的文件组成}
%   \label{tab:files}
%   \begin{tabular}{lll}
%     \toprule
%     类别     & 文件                      & 说明                           \\
%     \midrule
%     模板文件 & \file{ustcthesis.dtx}     & 模板原始代码文件，用户无需使用 \\
%              & \file{ustcthesis.cls}     & 文档类文件                     \\
%              & \file{ustcthesis-*.bst}   & 参考文献表格式                 \\
%              & \file{figures/ustc_*.pdf} & 校名和校徽图片                 \\
%     \midrule
%     生成文件 & \file{ustcthesis.pdf}     & （你正在阅读的）模板使用说明   \\
%     \midrule
%     示例文档 & \file{main.tex}           & 主文档                         \\
%              & \file{chapters/*.tex}     & 示例文档的各个章节             \\
%              & \file{figures/}           & 放置图片的目录                 \\
%              & \file{bib/ustc.bib}        & \BibTeX{} 示例数据库           \\
%     \midrule
%     其他     & \file{README.md}          & 基本说明                       \\
%              & \file{latexmkrc}          & latexmk 的配置文件             \\
%              & \file{Makefile}           & GNU make 的配置文件            \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% 示例文档包括了常用的 \LaTeX{} 命令，建议新手从此入手，用自己的内容进行替换。
%
% 文件 \file{ustcthesis.dtx} 是模板的原始代码文件，可以编译生成文档类文件
% \file{ustcthesis.cls} 和模板使用说明文件 \file{ustcthesis.pdf} 。
% 原始模板文件仅供模板开发者使用，一般用户无需使用。
%
%
% \subsection{依赖宏包}
%
% 本模板要求使用 TeX Live、MacTeX 或 MiKTeX 不低于 2017 年的发行版，
% 推荐升级到最新的版本。
%
% 模板直接依赖的宏包有：
% \pkg{amsmath},
% \pkg{caption},
% \pkg{calc},
% \pkg{color},
% \pkg{ctex},
% \pkg{fancyhdr},
% \pkg{footmisc},
% \pkg{geometry},
% \pkg{graphicx},
% \pkg{natbib},
% \pkg{notoccite},
% \pkg{titletoc},
% \pkg{url},
% \pkg{unicode-math}。
%
% 另外，模板还对其他宏包提供了支持，包括：
% \pkg{amsthm},
% \pkg{algorithm2e},
% \pkg{hyperref},
% \pkg{nomencl},
% \pkg{siunitx}。
% 这些宏包并非必需，用户可以根据需要选择使用。
% 模板在检测到这些宏包被调用后会自动进行配置。
%
% 注意，本模板\emph{不}兼容的宏包有：
% \pkg{amsfonts},
% \pkg{amssymb},
% \pkg{biblatex},
% \pkg{bm},
% \pkg{cite},
% \pkg{mathrsfs},
% \pkg{newtx},
% \pkg{upgreek}。
%
%
% \subsection{开始编译}
%
% \begin{enumerate}
%
% \item GNU make \\
% Linux/Mac用户，可以直接使用 GNU make 工具，这是最简单的方法。
% 编译论文 \file{main.pdf}：
% \begin{shell}
%   make
% \end{shell}
% 编译说明文档 \file{ustcthesis.pdf}：
% \begin{shell}
%   make doc
% \end{shell}
% 另外还可以用 \shellcmd{make clean} 清理辅助文件。
%
% \item |latexmk| \\
% Windows 用户可能无法使用GNU make，使用 |latexmk| 也是一个比较简单的方法，
% 配置文件由 \file{latexmkrc} 给出，其参数设置为 |-xelatex|，用户编译论文
% 只需使用命令：
% \begin{shell}
%   latexmk -xelatex main.tex
% \end{shell}
% 编译说明文档：
% \begin{shell}
%   latexmk -xelatex ustcthesis.dtx
% \end{shell}
% 清理辅助文件可以用 \shellcmd{latexmk -c}。图形界面用户应参考编辑器的使用说明。
%
% \item 手动编译 \\
% 手动编译是最繁琐的方法，用户可能需要运行多遍，以确保论文的交叉引用等信息全部正确。
%
% 编译论文 \file{main.pdf}：
% \begin{shell}
%   xelatex main
%   bibtex main
%   xelatex main
%   xelatex main
% \end{shell}
% 编译说明文档 \file{ustcthesis.pdf}：
% \begin{shell}
%   xelatex ustcthesis.dtx
%   makeindex -s gind.ist ustcthesis.idx
%   makeindex -s gglo.ist -o ustcthesis.gls ustcthesis.glo
%   xelatex ustcthesis.dtx
%   xelatex ustcthesis.dtx
% \end{shell}
% \end{enumerate}
%
%
%
% \section{模板设置}
%
%
% \subsection{文档类参数}
% \DescribeOption{degree}
% 选择学位，支持 \opt{bachelor}，\opt{master}，\opt{doctor}（默认）。
% \begin{latex}
%   \documentclass[degree=doctor]{ustcthesis}
% \end{latex}
%
% \DescribeOption{degree-type}
% 学位类型。可选：学术型 \opt{academic}（默认），专业型 \opt{professional}。
% \begin{latex}
%   \documentclass[degree-type=professional]{ustcthesis}
% \end{latex}
%
% \DescribeOption{language}
% 论文全文的主要语言。可选：\opt{chinese}（默认），\opt{english}。
% \begin{latex}
%   \documentclass[language=english]{ustcthesis}
% \end{latex}
%
% \DescribeOption{output}
% 输出 PDF 的类型：
% \begin{itemize}
%   \item \opt{print}（默认）：用于双面打印纸质论文
%   \item \opt{electronic}：单面，并保留超链接颜色
% \end{itemize}
% \begin{latex}
%   \documentclass[output=electronic]{ustcthesis}
% \end{latex}
%
% \DescribeOption{section-style}
% 本科生专用，章节标题的样式。可选：\opt{chinese}（默认），\opt{english}。
% \begin{itemize}
%   \item \opt{chinese}（默认）：汉字序号（例 1）
%   \item \opt{arabic}：数字序号（例 2）
% \end{itemize}
% \begin{latex}
%   \documentclass[section-style=arabic]{ustcthesis}
% \end{latex}
%
%
% \subsection{字体设置}
% 模板默认可以自动检测操作系统，并配置改平台上合适的字体，
% 具体的配置策略如表~\ref{tab:font}。
% \begin{table}[htb]
%   \centering
%   \caption{自动配置字体策略}
%   \label{tab:font}
%   \begin{tabular}{ccc}
%     \toprule
%     Windows         & macOS           & 其他            \\
%     \midrule
%     Times New Roman & Times New Roman & TeX Gyre Termes \\
%     Arial           & Arial           & TeX Gyre Heros  \\
%     Courier         & Menlo           & TeX Gyre Cursor \\
%     中易宋体        & 华文宋体        & Fandol 宋体     \\
%     中易黑体        & 华文黑体        & Fandol 黑体     \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% 然而自动配置的字体只能保证编译通过，但是还存在一些问题：
% \begin{enumerate}
%   \item 在其他平台上配置的 TeX Gyre 系列字体，虽然在风格上比较接近 Times 和 Arial，
%     但是毕竟跟《撰写手册》要求的字体不完全一致；
%   \item Fandol 字库的字形较少，常常出现缺字的情况；
%   \item 华文字库和 Fandol 字库虽然不违反《撰写手册》的要求，
%     但是其字形跟中易字库有所差别，这导致封面、标题的视觉效果与学校的 Word 示例不一致，
%     可能被审查老师认为格式不符合要求。
% \end{enumerate}
%
% 所以建议在提交最终版前使用 Windows 平台的字体进行编译。
%
% 用户也可以在调用模板时手动指定使用的字库，如：
% \begin{latex}
%   \documentclass[fontset=windows]{thuthesis}
% \end{latex}
% 该选项会传递给 \pkg{ctex} 宏包进行处理，
% 允许的值包括 \opt{windows}、\opt{mac}、\opt{fandol}，
% 详见 \pkg{ctex}、\pkg{xeCJK}、\pkg{fontspec} 等宏包的使用说明。
%
%
%
% \section{论文内容}
%
% 研究生论文的内容按照以下顺序排列：
% \begin{description}
%   \item[title page] 中文封面，英文封面，原创性声明及授权使用说明
%   \item[front matter] 中、英文摘要，目录，图、表清单，符号说明
%   \item[main matter] 正文章节，参考文献
%   \item[appendix] 附录
%   \item[back matter] 致谢，已发表论文列表
% \end{description}
%
% 本科生论文的内容按照以下顺序排列：
% \begin{description}
%   \item[title page] 中文封面，英文封面
%   \item[front matter] 致谢，目录，中、英文摘要
%   \item[main matter] 正文章节，参考文献
%   \item[appendix] 附录
% \end{description}
%
% 示例文档 \file{main.tex} 中的致谢、目录等章节的顺序，是按照研究生论文的格式组
% 织内容的，\emph{本科生需要手动调整顺序}。
%
%
% \subsection{封面}
%
% “封面”的名字让人有些混淆，它既可以指由印刷厂统一制作的硬皮封面（cover），也可
% 以指书打开后的第一页（title page）。在这里指的是后者，所以本模板从 title page
% 开始。
%
% \DescribeMacro{\maketitle}
% \DescribeMacro{\copyrightpage}
% 封面和声明页分别由 \cs{maketitle} 和 \cs{copyrightpage} 命令生成，
% 其中的各项信息使用 \cs{ustcsetup} 命令的方式填写，如：
% \begin{latex}
%   \thusetup{
%     title  = {论文中文题目},
%     title* = {Thesis English Title},
%   }
% \end{latex}
% 模板提供的选项见表~\ref{tab:covercmds}，
% \begin{table}[htb]
%   \centering\small
%   \caption{录入封面信息的命令}
%   \label{tab:covercmds}
%   \begin{tabular}{lll}
%     \toprule
%     命令                & 命令（英文）         & 说明       \\
%     \midrule
%     \opt{title}         & \opt{title*}         & 论文标题   \\
%     \opt{author}        & \opt{author*}        & 作者姓名   \\
%     \opt{major}         & \opt{major*}         & 学科专业   \\
%     \opt{supervisor}    & \opt{supervisor*}    & 导师姓名   \\
%     \opt{date}          & -                    & 完成时间   \\
%     \opt{secret-level}  & \opt{secret-level*}  & 密级       \\
%     \opt{secret-year}   & -                    & 保密年限   \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% 有几点说明：
% \begin{itemize}
%   \item \cs{ustcsetup} 使用 \pkg{kvsetkeys} 机制，配置项之间不能有空行，否则会报错。
%   \item 导师姓名 \opt{supervisor} 允许多个姓名，使用“,”（西文逗号 U+002C）隔开。
%   \item 完成时间 \opt{date} 应使用 ISO 格式，默认为当前日期。
%   \item 其中带 |*| 后缀的选项用于设置英文封面。
% \end{itemize}
%
%
% \subsection{摘要和章节}
% \DescribeEnv{abstract}
% \DescribeEnv{enabstract}
% \DescribeEnv{notation}
% \DescribeEnv{acknowledgements}
% \DescribeEnv{publications}
% 对于特殊的章节，\cls{ustcthesis} 还提供了相应的环境：
% \begin{itemize}
%   \item 中文摘要：\env{abstract}
%   \item 英文摘要：\env{enabstract}
%   \item 符号说明：\env{notation}
%   \item 致谢：    \env{acknowledgements}
%   \item 发表成果：\env{publications}
% \end{itemize}
%
% \DescribeOption{keywords}
% \DescribeOption{keywords*}
% 摘要的关键词应使用 \cs{ustcsetup} 的接口进行设置，
% 只要在摘要结束前即可，比如：
% \begin{latex}
%   \begin{abstract}
%     这里是摘要。
%     \ustcsetup{keywords = {论文；摘要；关键词}}
%   \end{abstract}
% \end{latex}
%
% \DescribeMacro{\tableofcontents}
% \DescribeMacro{\listoffigures}
% \DescribeMacro{\listoftables}
% 目录和图、表清单可以使用命令自动生成：
% \begin{itemize}
%   \item 目录：  \cs{tableofcontents}
%   \item 图清单：\cs{listoffigures}
%   \item 表清单：\cs{listoftables}
% \end{itemize}
%
%
% \subsection{浮动体}
%
% 《撰写手册》要求图题置于图的下方，表题置于表的上方。
% \LaTeX{} 的 \cs{caption} 命令并不能控制在浮动体中的位置，
% 需要作者注意写在合适的地方。
%
% \DescribeMacro{\note}
% 本模板还提供了 \cs{note}\marg{notes} 命令，用于在图表中添加注释。
%
% 关于图片的并排，推荐使用较新的 \pkg{subcaption} 宏包，不建议使用
% \pkg{subfigure} 或 \pkg{subfig}。
%
% 更多的表格样式参见 \pkg{booktabs}（三线表）、\pkg{longtable}（跨页表格）。
%
% 算法可以使用 \pkg{algorithms} 宏包或者较新的 \pkg{algorithm2e}。
%
%
% \subsection{数学}
%
% \LaTeX{} 默认按照美国的习惯排版数学公式和符号，
% 但是《撰写手册》要求数学符号依据 GB/T 3102.11-1993 《物理科学和技术中使用的数学符号》
% \footnote{原 GB/T 3102.11-1993}执行，
% 与 \LaTeX{} 的习惯有所差异。
% 本模板基于 \pkg{unicode-math} 宏包配置数学符号，以遵循国标的规定。
%
% 注意，\pkg{unicode-math} 宏包与 \pkg{amsfonts}, \pkg{amssymb}, \pkg{bm},
% \pkg{mathrsfs}, \pkg{upgreek} 等宏包\emph{不}兼容。
% 本模板作了处理，用户可以直接使用 \cs{bm}, \cs{mathscr},
% \cs{upGamma}。
%
% \DescribeMacro{\symup}
% \DescribeMacro{\symbf}
% 本模板中数学符号的用法与 \LaTeX{} 传统有些区别：
% \begin{itemize}
%   \item 数学常数和特殊函数使用正体，
%     如圆周率 $\symup{\pi}$、$\symup{\Gamma}$ 函数。
%     应使用 \pkg{unicode-math} 宏包提供的 \cs{symup} 命令转为正体，
%     如 |\symup{\pi}|。
%   \item 向量、矩阵和张量要求粗斜体，应使用 \cs{symbf} 命令，
%     如 |\symbf{A}|、|\symbf{\alpha}|。
%   \item 有限增量符号 $\increment$ （U+2206）应使用 \cs{increment} 命令。
%   \item 微分符号 $\mathrm{d}$ 使用正体，本模板提供了 \cs{dif} 命令。
% \end{itemize}
%
% 关于数学符号更多的用法，参见 \pkg{unicode-math} 宏包的使用说明和符号列表
% \pkg{unimath-symbols}。
%
%
% \subsection{参考文献}
%
% \DescribeMacro{\bibliographystyle}
% 按照《撰写手册》和 《GB/T 7714-2015》 的规定，
% 参考文献的标注体系分为“顺序编码制”和“著者-出版年制”（authoryear），
% 《撰写手册》推荐使用顺序编码制。
% 用户可以使用 \cs{bibliographystyle} 命令切换不同的参考文献表样式，
% 这也会自动设置相应的引用标注样式，如：
% \begin{latex}
%   \bibliographystyle{ustcthesis-authoryear}
% \end{latex}
%
% \DescribeMacro{\cite}
% 在正文中引用文献时应使用 \cs{cite} 命令。
% 同一处引用多篇文献时，需要将各篇文献的 key 一同写在参数中，
% 如 |\cite{knuth84,lamport94,mittelbach04}|。
% 它可以自动排序并用处理连续编号。
% 更多的引用标注方法可以参考 \pkg{natbib} 宏包的使用说明。
%
% \DescribeMacro{\inlinecite}
% \DescribeOption{cite-style}
% 在使用角标数字式时，如果文献序号作为叙述文字的一部分，
% 需要临时将文献序号与正文平排，
% 可以使用 \cs{inlinecite} 命令临时使用正文模式的引用标注，如：
% \begin{latex}
%   文献~\inlinecite{knuth84} 提出了一种新的断行算法
% \end{latex}
% 也可以在正文开始处统一切换全文的引用标注样式：
% \begin{latex}
%   \ustcsetup{}
%     cite-style = inline,
%   }
% \end{latex}
%
% 若需要标出引文的页码，可以标在 \cs{cite} 的可选参数中，如 |\cite[42]{abc}|。
%
% \DescribeMacro{\citep}
% \DescribeMacro{\citet}
% 在采用著者-出版年制时，如果将著者姓氏和出版年都置于“( )”内，
% 应使用 \cs{citep} 命令代替 \cs{cite} 来引用；
% 如果将著者姓氏作为正文的一部分，在其后的“( )”内只著录出版年，
% 则应使用 \cs{citet} 命令。
%
% \DescribeMacro{\bibliography}
% 参考文献表可以使用 \BibTeX{} 生成，并在文中使用 \cs{bibliography} 命令调用。
% \BibTeX{} 默认情况下可以自动识别文献语言，并自动处理文献类型和载体类型标识，
% 但是在少数情况下需要用户手动指定，如：
% \begin{latex}
%   @misc{citekey,
%     language = {japanese},
%     mark     = {Z},
%     medium   = {DK},
%     ...
%   }
% \end{latex}
% 可选的语言有 english, chinese, japanese, russian。
%
% 注意，国标规定参考文献表采用著者-出版年制组织时，各篇文献首先按文种集中，
% 然后按著者字顺和出版年排列；
% 中文文献可以按著者汉语拼音字顺排列，也可以按著者的笔画笔顺排列。
% 然而由于 \BibTeX{} 功能的局限性，无法自动获取著者姓名的拼音或笔画笔顺，
% 所以\emph{必须}在 bib 数据库中的 |key| 域手动录入著者姓名的拼音，如：
% \begin{latex}
%   @book{capital,
%     author = {马克思 and 恩格斯},
%     key    = {ma3 ke4 si1   en1 ge2 si1},
%     ...
%   }
% \end{latex}
%
% \BibTeX{} 对自定义样式的支持比较有限，
% 所以用户只能通过修改 \file{bst} 文件来修改文献列表的格式。
% 本宏包提供了一些接口供用户更方便地修改。
%
% 在 \file{bst} 文件开始处的 |load.config| 函数中，
% 有一组配置参数用来控制样式，表~\ref{tab:config} 列出了每一项的默认值和功能。
% 若变量被设为 |#1| 则表示该项被启用，设为 |#0| 则不启用。
% 默认的值是严格遵循《撰写手册》的配置。
%
% \begin{table}[htb]
% \centering\small
% \caption{参考文献表样式的配置参数}
% \label{tab:config}
% \begin{tabular}{lcl}
%   \toprule
%   参数值                         & 默认值 & 功能                           \\
%   \midrule
%   uppercase.name                 & |#1|   & 将著者姓名转为大写             \\
%   max.num.authors                & |#3|   & 输出著者的最多数量             \\
%   period.between.author.year     & |#0|   & 著者和年份之间使用句点连接     \\
%   sentence.case.title            & |#1|   & 将西文的题名转为 sentence case \\
%   link.title                     & |#0|   & 在题名上添加 url 的超链接      \\
%   show.mark                      & |#1|   & 显示文献类型标识               \\
%   italic.jounal                  & |#0|   & 西文期刊名使用斜体             \\
%   show.missing.address.publisher & |#1|   & 出版项缺失时显示“出版者不详”   \\
%   show.url                       & |#1|   & 显示 url                       \\
%   show.doi                       & |#1|   & 显示 doi                       \\
%   show.note                      & |#0|   & 显示 note 域的信息             \\
%   \bottomrule
% \end{tabular}
% \end{table}
%
% 如果需要每章生成独立的参考文献表，可以使用 \pkg{chapterbib} 宏包，
% 但是需要注意：
% \begin{enumerate}
%   \item 在 \file{main.tex} 中调用每章的子文件时必须使用 \cs{include} 命令；
%   \item 每章需要使用 \cs{bibliographystyle} 和 \cs{bibliography} 命令；
%   \item 如果手动调用 BibTeX，需要对每章生成的 \file{.aux} 文件编译，
%     （如果使用 \pkg{latexmk} 则可以自动处理）。
% \end{enumerate}
%
% \StopEventually
% \clearpage
% \appendix
%
%
% \section{代码实现}
% \label{sec:code}
% \linespread{1}
%
% 报错和警告
%    \begin{macrocode}
\newcommand\ustc@error[1]{%
  \ClassError{ustcthesis}{#1}{}%
}
\newcommand\ustc@warning[1]{%
  \ClassWarning{ustcthesis}{#1}%
}
%    \end{macrocode}
%
% 检查编译引擎，要求使用 XeLaTeX。
%    \begin{macrocode}
\RequirePackage{iftex}
\ifXeTeX\else
  \ustc@error{XeLaTeX is required to compile this document}
\fi
%    \end{macrocode}
%
%
% \subsection{处理选项}
%
%    \begin{macrocode}
\RequirePackage{kvdefinekeys}
\RequirePackage{kvsetkeys}
\RequirePackage{kvoptions}
%    \end{macrocode}
%
% \begin{macro}{\ustcsetup}
% 提供一个 \cs{ustcsetup} 命令支持 \emph{key-value} 的方式来设置。
%    \begin{macrocode}
\newcommand\ustcsetup{%
  \kvsetkeys{ustc}%
}
%    \end{macrocode}
% \end{macro}
%
% 同时用 \emph{key-value} 的方式来定义这些接口：
% \begin{latex}
%   \ustc@define@key{
%     <key> = {
%       name = <name>,
%       choices = {
%         <choice1>,
%         <choice2>,
%       },
%       default = <default>,
%       code = <code>,
%     },
%   }
% \end{latex}
%
% 其中 |choices| 设置允许使用的值，默认为第一个（或者 \meta{default}）；
% \meta{code} 是相应的内容被设置时执行的代码。
%
%    \begin{macrocode}
\newcommand\ustc@define@key[1]{%
  \kvsetkeys{ustc@key}{#1}%
}
\kv@set@family@handler{ustc@key}{%
%    \end{macrocode}
%
% \cs{ustcsetup} 会将 \meta{value} 存到 \cs{ustc@\meta{key}}，
% 但是宏的名字包含 “-” 这样的特殊字符时不方便直接调用，比如 |key = math-style|，
% 这时可以用 |name| 设置 \meta{key} 的别称，比如 |key = math@style|，
% 这样就可以通过 \cs{ustc@math@style} 来引用。
% |default| 是定义该 \meta{key} 时默认的值，缺省为空。
%
%    \begin{macrocode}
  \@namedef{ustc@#1@@name}{#1}%
  \def\ustc@@default{}%
  \def\ustc@@choices{}%
  \kv@define@key{ustc@value}{name}{%
    \@namedef{ustc@#1@@name}{##1}%
  }%
  \kv@define@key{ustc@value}{code}{%
    \@namedef{ustc@#1@@code}{##1}%
  }%
%    \end{macrocode}
%
% 由于在定义接口时，\cs{ustc@\meta{key}@@code} 不一定有定义，
% 而且在文档类/宏包中还有可能对该 |key| 的 |code| 进行添加。
% 所以 \cs{ustc@\meta{key}@@code} 会检查如果在定义文档类/宏包时则推迟执行，否则立即执行。
%
%    \begin{macrocode}
  \@namedef{ustc@#1@@check}{}%
  \@namedef{ustc@#1@@code}{}%
  \@namedef{ustc@#1@@hook}{%
    \@nameuse{ustc@#1@@code}%
  }%
%    \end{macrocode}
%
% 保存下 |choices = {}| 定义的内容，在定义 \cs{ustc@\meta{name}} 后再执行。
%
%    \begin{macrocode}
  \kv@define@key{ustc@value}{choices}{%
    \def\ustc@@choices{##1}%
    \@namedef{ustc@#1@@reset}{}%
%    \end{macrocode}
%
% \cs{ustc@\meta{key}@check} 检查 |value| 是否有效，
% 并设置 \cs{ifustc@\meta{name}@\meta{value}}。
%
%    \begin{macrocode}
    \@namedef{ustc@#1@@check}{%
      \@ifundefined{%
        ifustc@\@nameuse{ustc@#1@@name}@\@nameuse{ustc@\@nameuse{ustc@#1@@name}}%
      }{%
        \ustc@error{Invalid value "#1 = \@nameuse{ustc@\@nameuse{ustc@#1@@name}}"}%
      }%
      \@nameuse{ustc@#1@@reset}%
      \@nameuse{ustc@\@nameuse{ustc@#1@@name}@\@nameuse{ustc@\@nameuse{ustc@#1@@name}}true}%
    }%
  }%
  \kv@define@key{ustc@value}{default}{%
    \def\ustc@@default{##1}%
  }%
  \kvsetkeys{ustc@value}{#2}%
  \@namedef{ustc@\@nameuse{ustc@#1@@name}}{}%
%    \end{macrocode}
%
% 第一个 \meta{choice} 设为 \meta{default}，
% 并且对每个 \meta{choice} 定义 \cs{ifustc@\meta{name}@\meta{choice}}。
%
%    \begin{macrocode}
  \kv@set@family@handler{ustc@choice}{%
    \ifx\ustc@@default\@empty
      \def\ustc@@default{##1}%
    \fi
    \expandafter\newif\csname ifustc@\@nameuse{ustc@#1@@name}@##1\endcsname
    \expandafter\g@addto@macro\csname ustc@#1@@reset\endcsname{%
      \@nameuse{ustc@\@nameuse{ustc@#1@@name}@##1false}%
    }%
  }%
  \kvsetkeys@expandafter{ustc@choice}{\ustc@@choices}%
%    \end{macrocode}
%
% 将 \meta{default} 赋值到 \cs{ustc@\meta{name}}，如果非空则执行相应的代码。
%
%    \begin{macrocode}
  \expandafter\let\csname ustc@\@nameuse{ustc@#1@@name}\endcsname\ustc@@default
  \expandafter\ifx\csname ustc@\@nameuse{ustc@#1@@name}\endcsname\@empty\else
    \@nameuse{ustc@#1@@check}%
    \@nameuse{ustc@#1@@hook}%
  \fi
%    \end{macrocode}
%
% 定义 \cs{ustcsetup} 接口。
%
%    \begin{macrocode}
  \kv@define@key{ustc}{#1}{%
    \@namedef{ustc@\@nameuse{ustc@#1@@name}}{##1}%
    \@nameuse{ustc@#1@@check}%
    \@nameuse{ustc@#1@@hook}%
  }%
}
%    \end{macrocode}
%
% 定义接口向 |key| 添加 |code|：
%
%    \begin{macrocode}
\newcommand\ustc@option@hook[2]{%
  \expandafter\g@addto@macro\csname ustc@#1@@code\endcsname{#2}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
\newif\ifustc@degree@graduate
\newcommand\ustc@set@graduate{%
  \ifustc@degree@bachelor
    \ustc@degree@graduatefalse
  \else
    \ustc@degree@graduatetrue
  \fi
}
\ustc@define@key{
  degree = {
    choices = {
      doctor,
      master,
      bachelor,
    },
    default = doctor,
    code    = {\ustc@set@graduate},
  },
  degree-type = {
    name = degree@type,
    choices = {
      academic,
      professional,
    },
    default = academic,
  },
  language = {
    choices = {
      chinese,
      english,
    },
    default = chinese,
  },
  fontset = {
    choices = {
      windows,
      mac,
      ubuntu,
      fandol,
      none,
    },
    default = none,
  },
  system = {
    choices = {
      mac,
      unix,
      windows,
      auto,
    },
    default = auto,
  },
  font = {
    choices = {
      times,
      texgyre,
      xits,
      libertinus,
      latin-modern,
      auto,
      none,
    },
    default = auto,
  },
  cjk-font = {
    name = cjk@font,
    choices = {
      windows,
      mac,
      noto,
      fandol,
      auto,
      none,
    },
    default = auto,
  },
  math-font = {
    name = math@font,
    choices = {
      xits,
      stix,
      libertinus,
      latin-modern,
      none,
    },
    default = xits,
  },
  cite-style = {
    name = cite@style,
    choices = {
      super,
      inline,
      authoryear,
    },
  },
  output = {
    choices = {
      print,
      electronic,
    },
    default = print,
  },
  section-style = {
    name = section@style,
    choices = {
      chinese,
      arabic,
    },
    default = chinese,
  },
  badge-color = {
    name = badge@color,
    choices = {
      blue,
      black,
    },
    default = blue,
  },
}
\ifustc@degree@bachelor
  \ifustc@language@english
    \ustcsetup{section-style = arabic}
  \fi
\fi
\ustc@option@hook{language}{%
  \ifustc@degree@bachelor
    \ifustc@language@english
      \ustcsetup{section-style = arabic}%
    \fi
  \fi
}
%    \end{macrocode}
%
% 使用 \pkg{kvoptions} 提供的 key-value 接口，
%    \begin{macrocode}
\SetupKeyvalOptions{
  family  = ustc,
  prefix  = ustc@,
  setkeys = \kvsetkeys,
}
%    \end{macrocode}
%
% 兼容旧版本的文档类选项。
%    \begin{macrocode}
% Reserved for compatibility until 2020-07-01.
\DeclareVoidOption{doctor}{\ustcsetup{degree=doctor}}
\DeclareVoidOption{master}{\ustcsetup{degree=master}}
\DeclareVoidOption{bachelor}{\ustcsetup{degree=bachelor}}
\DeclareVoidOption{chinese}{\ustcsetup{language=chinese}}
\DeclareVoidOption{english}{\ustcsetup{language=english}}
\DeclareVoidOption{academic}{\ustcsetup{degree-type=academic}}
\DeclareVoidOption{professional}{\ustcsetup{degree-type=professional}}
\DeclareVoidOption{print}{\ustcsetup{output=print}}
\DeclareVoidOption{pdf}{\ustcsetup{pdf=electronic}}
\newif\ifustc@legacy@cite@style
\DeclareVoidOption{super}{\ustcsetup{cite-style=super}\ustc@legacy@cite@styletrue}
\DeclareVoidOption{numbers}{\ustcsetup{cite-style=inline}\ustc@legacy@cite@styletrue}
\DeclareVoidOption{authoryear}{\ustcsetup{cite-style=authoryear}\ustc@legacy@cite@styletrue}
\DeclareVoidOption{arabic}{\ustcsetup{section-style=arabic}}
\DeclareVoidOption{colorlogo}{\ustcsetup{badge-color=blue}}
\DeclareVoidOption{bwlogo}{\ustcsetup{badge-color=black}}
%    \end{macrocode}
%
% 载入 \cls{ctexbook}。
%    \begin{macrocode}
\PassOptionsToClass{openany}{ctexbook}
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{ctexbook}}
\ProcessKeyvalOptions*
%    \end{macrocode}
%
%
% \subsection{加载文档类和宏包}
%
%    \begin{macrocode}
\ifustc@language@chinese
  \PassOptionsToClass{scheme=chinese}{ctexbook}
\else
  \PassOptionsToClass{scheme=plain}{ctexbook}
\fi
\ifustc@output@electronic
  \PassOptionsToClass{oneside}{book}
\fi
\PassOptionsToPackage{quiet}{xeCJK}
%    \end{macrocode}
%
% 载入 \cls{ctexbook} 文档类，注意要求为 2.2 或更高的版本。
%    \begin{macrocode}
\LoadClass[UTF8,a4paper,zihao=-4,fontset=none]{ctexbook}[2017/04/01]
%    \end{macrocode}
%
% 检测 ctexbook 版本，如果版本过低会报错
%    \begin{macrocode}
\@ifclasslater{ctexbook}{2017/04/01}{}{
  \ustc@error{TeX Live 2017 or later version is required}
}
%    \end{macrocode}
%
% 建议在模板开始处载入全部宏包，不要轻易改变加载顺序。
% \pkg{hyperref} 一般在最后加载。
%    \begin{macrocode}
\RequirePackage{amsmath}
\RequirePackage{fontspec}[2017/03/31]
\RequirePackage{unicode-math}
\RequirePackage[driver=xetex]{geometry}
\RequirePackage{graphicx}
\RequirePackage{fancyhdr}
\RequirePackage{color}
\RequirePackage{titletoc}
\RequirePackage{caption}
\RequirePackage[perpage]{footmisc}
\RequirePackage{url}
\RequirePackage{calc}
\RequirePackage{natbib}
\RequirePackage{notoccite}
%    \end{macrocode}
%
% 对冲突的宏包报错。
%    \begin{macrocode}
\RequirePackage{filehook}
\newcommand\ustc@package@conlict[2]{%
  \AtBeginOfPackageFile*{#2}{%
    \ustc@error{%
      The "#2" package is incompatible with "#1"
      which is required by ustcthesis%
    }%
  }%
}
\ustc@package@conlict{unicode-math}{amscd}
\ustc@package@conlict{unicode-math}{amsfonts}
\ustc@package@conlict{unicode-math}{amssymb}
\ustc@package@conlict{unicode-math}{bbm}
\ustc@package@conlict{unicode-math}{bm}
\ustc@package@conlict{unicode-math}{eucal}
\ustc@package@conlict{unicode-math}{eufrak}
\ustc@package@conlict{unicode-math}{mathrsfs}
\ustc@package@conlict{unicode-math}{savesym}
\ustc@package@conlict{unicode-math}{textcomp}
%    \end{macrocode}
%
%
% \subsection{字体}
%
% 处理 \opt{fontset}
%    \begin{macrocode}
\ifustc@fontset@mac
  \ustcsetup{
    font     = times,
    cjk-font = mac,
  }
\else
  \ifustc@fontset@windows
    \ustcsetup{
      font     = times,
      cjk-font = windows,
    }
  \else
    \ifustc@fontset@fandol
      \ustcsetup{
        font     = texgyre,
        cjk-font = fandol,
      }
    \else
      \ifustc@fontset@ubuntu
        \ustcsetup{
          font     = texgyre,
          cjk-font = noto,
        }
      \fi
    \fi
  \fi
\fi
%    \end{macrocode}
%
% 检测系统
%    \begin{macrocode}
\ifustc@system@auto
  \IfFileExists{/System/Library/Fonts/Menlo.ttc}{
    \ustcsetup{system = mac}
  }{
    \IfFileExists{/dev/null}{
      \IfFileExists{null:}{
        \ustcsetup{system = windows}
      }{
        \ustcsetup{system = unix}
      }
    }{
      \ustcsetup{system = windows}
    }
  }
\fi
%    \end{macrocode}
%
% XITS 字体于 2018-10-03 更改了字体的文件名，所以需要判断。
% 原文件名为 \file{xits-regular.otf}、\file{xits-math.otf} 等，
% 后改为 \file{XITS-Regular.otf}、\file{XITSMath-Regular.otf} 等。
%
% Libertinus 字体同样。
%    \begin{macrocode}
\let\ustc@font@family@xits\@empty
\newcommand\ustc@set@xits@names{%
  \ifx\ustc@font@family@xits\@empty
    \IfFontExistsTF{XITSMath-Regular.otf}{%
      \gdef\ustc@font@family@xits{XITS}%
      \gdef\ustc@font@style@xits@rm{Regular}%
      \gdef\ustc@font@style@xits@bf{Bold}%
      \gdef\ustc@font@style@xits@it{Italic}%
      \gdef\ustc@font@style@xits@bfit{BoldItalic}%
      \gdef\ustc@font@name@xits@math@rm{XITSMath-Regular}%
      \gdef\ustc@font@name@xits@math@bf{XITSMath-Bold}%
    }{%
      \gdef\ustc@font@family@xits{xits}%
      \gdef\ustc@font@style@xits@rm{regular}%
      \gdef\ustc@font@style@xits@bf{bold}%
      \gdef\ustc@font@style@xits@it{italic}%
      \gdef\ustc@font@style@xits@bfit{bolditalic}%
      \gdef\ustc@font@name@xits@math@rm{xits-math}%
      \gdef\ustc@font@name@xits@math@bf{xits-mathbold}%
    }%
  \fi
}
\let\ustc@font@family@libertinus\@empty
\newcommand\ustc@set@libertinus@names{%
  \ifx\ustc@font@family@libertinus\@empty
    \IfFontExistsTF{LibertinusSerif-Regular.otf}{%
      \gdef\ustc@font@family@libertinus@serif{LibertinusSerif}%
      \gdef\ustc@font@family@libertinus@sans{LibertinusSans}%
      \gdef\ustc@font@name@libertinus@math{LibertinusMath-Regular}%
      \gdef\ustc@font@style@libertinus@rm{Regular}%
      \gdef\ustc@font@style@libertinus@bf{Bold}%
      \gdef\ustc@font@style@libertinus@it{Italic}%
      \gdef\ustc@font@style@libertinus@bfit{BoldItalic}%
    }{%
      \gdef\ustc@font@family@libertinus@serif{libertinusserif}%
      \gdef\ustc@font@family@libertinus@sans{libertinussans}%
      \gdef\ustc@font@name@libertinus@math{libertinusmath-regular}%
      \gdef\ustc@font@style@libertinus@rm{regular}%
      \gdef\ustc@font@style@libertinus@bf{bold}%
      \gdef\ustc@font@style@libertinus@it{italic}%
      \gdef\ustc@font@style@libertinus@bfit{bolditalic}%
    }%
  \fi
}
%    \end{macrocode}
%
% 《撰写手册》要求西文字体使用 Times New Roman 和 Arial，
% 但是在 Linux 下没有这两个字体，所以使用它们的克隆版 TeX Gyre Termes 和
% TeX Gyre Heros。
%    \begin{macrocode}
\ifustc@font@auto
  \ifustc@system@unix
    \ustcsetup{font=xits}
  \else
    \ustcsetup{font=times}
  \fi
\fi
\newcommand\ustc@load@font@times{%
  \setmainfont{Times New Roman}%
  \setsansfont{Arial}%
  \ifustc@system@mac
    \setmonofont{Menlo}[Scale = MatchLowercase]%
  \else
    \setmonofont{Courier New}[Scale = MatchLowercase]%
  \fi
}
\newcommand\ustc@load@font@texgyre{%
  \setmainfont{texgyretermes}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-italic,
    BoldItalicFont = *-bolditalic,
  ]%
  \ustc@load@texgyre@sans@mono
}
\newcommand\ustc@load@texgyre@sans@mono{%
  \setsansfont{texgyreheros}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-italic,
    BoldItalicFont = *-bolditalic,
    Scale          = MatchLowercase,
  ]%
  \setmonofont{texgyrecursor}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-italic,
    BoldItalicFont = *-bolditalic,
    Scale          = MatchLowercase,
  ]%
}
\newcommand\ustc@load@font@xits{%
  \ustc@set@xits@names
  \setmainfont{\ustc@font@family@xits}[
    Extension      = .otf,
    UprightFont    = *-\ustc@font@style@xits@rm,
    BoldFont       = *-\ustc@font@style@xits@bf,
    ItalicFont     = *-\ustc@font@style@xits@it,
    BoldItalicFont = *-\ustc@font@style@xits@bfit,
  ]%
  \ustc@load@texgyre@sans@mono
}
\newcommand\ustc@load@font@libertinus{%
  \ustc@set@libertinus@names
  \setmainfont{\ustc@font@family@libertinus@serif}[
    Extension      = .otf,
    UprightFont    = *-\ustc@font@style@libertinus@rm,
    BoldFont       = *-\ustc@font@style@libertinus@bf,
    ItalicFont     = *-\ustc@font@style@libertinus@it,
    BoldItalicFont = *-\ustc@font@style@libertinus@bfit,
  ]%
  \setsansfont{\ustc@font@family@libertinus@sans}[
    Extension      = .otf,
    UprightFont    = *-\ustc@font@style@libertinus@rm,
    BoldFont       = *-\ustc@font@style@libertinus@bf,
    ItalicFont     = *-\ustc@font@style@libertinus@it,
  ]%
  \setmonofont{lmmonolt10}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-oblique,
    BoldItalicFont = *-boldoblique,
  ]%
}
\@namedef{ustc@load@font@latin-modern}{%
  \setmainfont{lmroman10}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-italic,
    BoldItalicFont = *-bolditalic,
  ]%
  \setsansfont{lmsans10}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-oblique,
    BoldItalicFont = *-boldoblique,
  ]%
  \setmonofont{lmmonolt10}[
    Extension      = .otf,
    UprightFont    = *-regular,
    BoldFont       = *-bold,
    ItalicFont     = *-oblique,
    BoldItalicFont = *-boldoblique,
  ]%
}
\newcommand\ustc@load@font{%
  \@nameuse{ustc@load@font@\ustc@font}%
}
\ustc@load@font
\ustc@option@hook{font}{\ustc@load@font}
%    \end{macrocode}
%
% 中文字体
%    \begin{macrocode}
\ifustc@cjk@font@auto
  \ifustc@system@mac
    \ustcsetup{cjk-font = mac}
  \else
    \ifustc@system@windows
      \ustcsetup{cjk-font = windows}
    \else
      \IfFontExistsTF{Noto Serif CJK SC}{
        \ustcsetup{cjk-font = noto}
      }{
        \ustcsetup{cjk-font = fandol}
      }
    \fi
  \fi
\fi
\newcommand\ustc@load@cjk@font@windows{%
  \xeCJKsetup{EmboldenFactor=2}
  \setCJKmainfont{SimSun}[
    AutoFakeBold = true,
    ItalicFont   = KaiTi,
  ]%
  \setCJKsansfont{SimHei}[AutoFakeBold]%
  \setCJKmonofont{FangSong}%
  \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold]%
  \setCJKfamilyfont{zhhei}{SimHei}[AutoFakeBold]%
  \setCJKfamilyfont{zhkai}{KaiTi}%
  \setCJKfamilyfont{zhfs}{FangSong}%
}
\newcommand\ustc@load@cjk@font@mac{%
  \setCJKmainfont{Songti SC}[
    UprightFont    = * Light,
    BoldFont       = * Bold,
    ItalicFont     = Kaiti SC,
    BoldItalicFont = Kaiti SC Bold,
  ]%
  \setCJKsansfont{Heiti SC}[BoldFont=* Medium]%
  \setCJKmonofont{STFangsong}
  \setCJKfamilyfont{zhsong}{Songti SC}[
    UprightFont = * Light,
      BoldFont  = * Bold,
  ]%
  \setCJKfamilyfont{zhhei}{Heiti SC}[
    UprightFont = * Light,
    BoldFont    = * Medium,
  ]%
  \setCJKfamilyfont{zhfs}{STFangsong}%
  \setCJKfamilyfont{zhkai}{Kaiti SC}[BoldFont = * Bold]%
  \setCJKfamilyfont{zhli}{Baoli SC}%
  \setCJKfamilyfont{zhyuan}{Yuanyi SC}[
    UprightFont = * Light,
    BoldFont    = * Bold,
  ]%
  \xeCJKsetwidth{‘’“”}{1em}%
}
\newcommand\ustc@load@cjk@font@noto{%
  \setCJKmainfont{Noto Serif CJK SC}[
    UprightFont = * Light,
    BoldFont    = * Bold,
    ItalicFont  = FandolKai,
  ]%
  \setCJKsansfont{Noto Sans CJK SC}[
    UprightFont = * Regular,
    BoldFont    = * Medium,
  ]%
  \setCJKmonofont{Noto Serif CJK SC}[
    UprightFont = * Light,
    UprightFont = * Bold,
  ]%
  \setCJKfamilyfont{zhsong}{Noto Serif CJK SC}[
    UprightFont = * Light,
    UprightFont = * Bold,
  ]%
  \setCJKfamilyfont{zhhei}{Noto Sans CJK SC}[
    UprightFont = * Regular,
    BoldFont    = * Medium,
  ]%
  \setCJKfamilyfont{zhfs}{FandolFang}[
    Extension   = .otf,
    UprightFont = *-Regular,
  ]%
  \setCJKfamilyfont{zhkai}{FandolKai}[
    Extension   = .otf,
    UprightFont = *-Regular,
  ]%
}
\newcommand\ustc@load@cjk@font@fandol{%
  \setCJKmainfont{FandolSong}[
    Extension   = .otf,
    UprightFont = *-Regular,
    BoldFont    = *-Bold,
    ItalicFont  = FandolKai-Regular,
  ]%
  \setCJKsansfont{FandolHei}[
    Extension   = .otf,
    UprightFont = *-Regular,
    BoldFont    = *-Bold,
  ]%
  \setCJKmonofont{FandolFang}[
    Extension   = .otf,
    UprightFont = *-Regular,
  ]%
  \setCJKfamilyfont{zhsong}{FandolSong}[
    Extension   = .otf,
    UprightFont = *-Regular,
    BoldFont    = *-Bold,
  ]%
  \setCJKfamilyfont{zhhei}{FandolHei}[
    Extension   = .otf,
    UprightFont = *-Regular,
    BoldFont    = *-Bold,
  ]%
  \setCJKfamilyfont{zhfs}{FandolFang}[
    Extension   = .otf,
    UprightFont = *-Regular,
  ]%
  \setCJKfamilyfont{zhkai}{FandolKai}[
    Extension   = .otf,
    UprightFont = *-Regular,
  ]%
}
\ifustc@cjk@font@none\else
  \providecommand\songti{\CJKfamily{zhsong}}
  \providecommand\heiti{\CJKfamily{zhhei}}
  \providecommand\fangsong{\CJKfamily{zhfs}}
  \providecommand\kaishu{\CJKfamily{zhkai}}
\fi
\newcommand\ustc@load@cjk@font{%
  \@nameuse{ustc@load@cjk@font@\ustc@cjk@font}%
}
\ustc@load@cjk@font
\ustc@option@hook{cjk-font}{\ustc@load@cjk@font}
%    \end{macrocode}
%
% 使用 \pkg{unicode-math} 配置数学字体。
%    \begin{macrocode}
\unimathsetup{
  math-style = ISO,
  bold-style = ISO,
  nabla      = upright,
  partial    = upright,
}
\newcommand\ustc@load@math@font@xits{%
  \ustc@set@xits@names
  \setmathfont{\ustc@font@name@xits@math@rm}[
    Extension    = .otf,
    BoldFont     = \ustc@font@name@xits@math@bf,
    StylisticSet = 8,
  ]%
  \setmathfont{\ustc@font@name@xits@math@rm}[
    Extension    = .otf,
    StylisticSet = 1,
    range        = {cal,bfcal},
  ]%
}
\newcommand\ustc@load@math@font@stix{%
  \setmathfont{STIX2Math}[
    Extension    = .otf,
    StylisticSet = 8,
  ]%
  \setmathfont{STIX2Math}[
    Extension    = .otf,
    StylisticSet = 1,
    range        = {cal,bfcal},
  ]%
}
\newcommand\ustc@load@math@font@libertinus{%
  \ustc@set@libertinus@names
  \setmathfont{\ustc@font@name@libertinus@math .otf}%
}
\@namedef{ustc@load@math@font@latin-modern}{%
  \setmathfont{latinmodern-math.otf}%
}
\newcommand\ustc@load@math@font{%
  \csname ustc@load@math@font@\ustc@math@font\endcsname
}
\ustc@load@math@font
\ustc@option@hook{math-font}{\ustc@load@math@font}
%    \end{macrocode}
%
% \begin{macro}{\ustc@circlefont}
% 研究生的五级节标题和脚注需要使用带圈数字，
% 但 Times New Roman 没有这些符号的字形，而华文宋体和中易宋体提供了这些字形，
% 配置在 \cs{ustc@circlefont}。
%    \begin{macrocode}
\ifustc@font@times
  \ifustc@cjk@font@mac
    \newfontfamily\ustc@circlefont{Songti SC Light}
  \else
    \ifustc@cjk@font@windows
      \newfontfamily\ustc@circlefont{SimSun}
    \fi
  \fi
\else
  \ustc@set@xits@names
  \newfontfamily\ustc@circlefont{%
    \ustc@font@family@xits-\ustc@font@style@xits@rm.otf%
  }
\fi
%    \end{macrocode}
% \end{macro}
%
% 目前最广泛使用的印刷的长度单位点（磅）通常指 PostScript point
% \footnote{\url{https://en.wikipedia.org/wiki/Point_(typography)}}，
% 在 \LaTeX{} 中是 bp，比默认的 pt 略大。
% 这里保存起来可以节约编译时间。
%    \begin{macrocode}
\newdimen\bp@
\bp@=1bp
%    \end{macrocode}
%
% 下面设置字号。正文字号12bp，研究生行距20bp，本科生行距22bp；
% 其他命令的行距按照相同的的比例设置，如表~\ref{tab:fontsize}。
% \begin{table}[htb]
%   \centering
%   \caption{标准字体命令与字号、行距的对应}
%   \label{tab:fontsize}
%   \begin{tabular}{lllll}
%     \toprule
%     字体命令          & 字号 & bp   & 研究生行距 & 本科生行距 \\
%     \midrule
%     \cs{tiny}         & 小六 & 6.5  & 10.83      & 11.92      \\
%     \cs{scriptsize}   & 六号 & 7.5  & 12.5       & 13.75      \\
%     \cs{footnotesize} & 小五 & 9    & 15         & 16.5       \\
%     \cs{small}        & 五号 & 10.5 & 17.5       & 19.25      \\
%     \cs{normalsize}   & 小四 & 12   & 20         & 22         \\
%     \cs{large}        & 小三 & 15   & 25         & 27.5       \\
%     \cs{Large}        & 小二 & 18   & 30         & 33         \\
%     \cs{LARGE}        & 二号 & 22   & 36.67      & 40.33      \\
%     \cs{huge}         & 小一 & 24   & 40         & 44         \\
%     \cs{Huge}         & 一号 & 26   & 43.33      & 47.67      \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%    \begin{macrocode}
\ifustc@degree@graduate
  \renewcommand\normalsize{%
    \@setfontsize\normalsize{12\bp@}{20\bp@}%
    \abovedisplayskip 12\bp@ \@plus3\bp@ \@minus7\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6.5\bp@ \@plus3.5\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
    \let\@listi\@listI}
  \normalsize
%    \end{macrocode}
%
% 注意第~\ref{sec:list} 节去掉了列表的间距，所以不再修改 \cs{@listi}。
%    \begin{macrocode}
  \renewcommand\small{%
    \@setfontsize\small{10.5\bp@}{17.5\bp@}%
    \abovedisplayskip 10.5\bp@ \@plus3\bp@ \@minus6\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6.5\bp@ \@plus3.5\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
  }
  \renewcommand\footnotesize{%
    \@setfontsize\footnotesize{9\bp@}{15\bp@}%
    \abovedisplayskip 9\bp@ \@plus2\bp@ \@minus5\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6\bp@ \@plus3\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
  }
  \renewcommand\scriptsize{\@setfontsize\scriptsize{7.5\bp@}{12.5\bp@}}
  \renewcommand\tiny{\@setfontsize\tiny{6.5\bp@}{10.83\bp@}}
  \renewcommand\large{\@setfontsize\large{15\bp@}{25\bp@}}
  \renewcommand\Large{\@setfontsize\Large{18\bp@}{30\bp@}}
  \renewcommand\LARGE{\@setfontsize\LARGE{22\bp@}{36.67\bp@}}
  \renewcommand\huge{\@setfontsize\huge{24\bp@}{40\bp@}}
  \renewcommand\Huge{\@setfontsize\Huge{26\bp@}{43.33\bp@}}
\else
  \renewcommand\normalsize{%
    \@setfontsize\normalsize{12\bp@}{22\bp@}%
    \abovedisplayskip 12\bp@ \@plus3\bp@ \@minus7\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6.5\bp@ \@plus3.5\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
    \let\@listi\@listI}
  \normalsize
  \renewcommand\small{%
    \@setfontsize\small{10.5\bp@}{19.25\bp@}%
    \abovedisplayskip 10.5\bp@ \@plus3\bp@ \@minus6\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6.5\bp@ \@plus3.5\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
  }
  \renewcommand\footnotesize{%
    \@setfontsize\footnotesize{9\bp@}{16.5\bp@}%
    \abovedisplayskip 9\bp@ \@plus2\bp@ \@minus5\bp@
    \abovedisplayshortskip \z@ \@plus3\bp@
    \belowdisplayshortskip 6\bp@ \@plus3\bp@ \@minus3\bp@
    \belowdisplayskip \abovedisplayskip
  }
  \renewcommand\scriptsize{\@setfontsize\scriptsize{7.5\bp@}{13.75\bp@}}
  \renewcommand\tiny{\@setfontsize\tiny{6.5\bp@}{11.92\bp@}}
  \renewcommand\large{\@setfontsize\large{15\bp@}{27.5\bp@}}
  \renewcommand\Large{\@setfontsize\Large{18\bp@}{33\bp@}}
  \renewcommand\LARGE{\@setfontsize\LARGE{22\bp@}{40.33\bp@}}
  \renewcommand\huge{\@setfontsize\huge{24\bp@}{44\bp@}}
  \renewcommand\Huge{\@setfontsize\Huge{26\bp@}{47.67\bp@}}
\fi
%    \end{macrocode}
%
% 设置行距的倍数为 1。
%    \begin{macrocode}
\linespread{1}\selectfont
%    \end{macrocode}
%
%
% \subsection{处理语言}
%
% 由于 Unicode 的一些标点符号是中西文混用的：
% \unicodechar{00B7}、
% \unicodechar{2013}、
% \unicodechar{2014}、
% \unicodechar{2018}、
% \unicodechar{2019}、
% \unicodechar{201C}、
% \unicodechar{201D}、
% \unicodechar{2025}、
% \unicodechar{2026}、
% \unicodechar{2E3A}，
% 所以要根据语言设置正确的字体。
% \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/389}}
% 所以要根据语言设置正确的字体。
%    \begin{macrocode}
\newcommand\ustc@setchinese{%
  \xeCJKResetPunctClass
}
\newcommand\ustc@setenglish{%
  \xeCJKDeclareCharClass{HalfLeft}{"2018, "201C}%
  \xeCJKDeclareCharClass{HalfRight}{%
    "00B7, "2019, "201D, "2013, "2014, "2025, "2026, "2E3A%
  }%
}
\newcommand\ustc@setdefaultlanguage{%
  \ifustc@language@chinese
    \ustc@setchinese
  \else
    \ustc@setenglish
  \fi
}
%    \end{macrocode}
%
% 这里设置了中英文的各种名字。
%
% 由于《撰写手册》中的“speciality”一词使用的是英式拼法，
% 所以“acknowledgements”也保持一致。
%    \begin{macrocode}
\ifustc@language@chinese
  \renewcommand\listfigurename{插图清单}
  \renewcommand\listtablename{表格清单}
  \newcommand\ustc@acknowledgements@name{致谢}
  \newcommand\ustc@publication@name{在读期间发表的学术论文与取得的研究成果}
  \newcommand\ustc@notation@name{符号说明}
\else
  \renewcommand\figurename{Fig.}
  \newcommand\ustc@acknowledgements@name{Acknowledgements}
  \newcommand\ustc@publication@name{Publications}
  \newcommand\ustc@notation@name{Notation}
\fi
%    \end{macrocode}
%
%
% \subsection{纸张和页面}
% 使用 \pkg{geometry} 宏包设置纸张和页面。
%
% 纸张：A4；
%
% 页面设置：上、下 2.54 cm，左、右 3.17 cm，页眉 1.5 cm，页脚 1.75 cm。
%
% 注意这里指的是页眉顶部到纸张顶部的距离为 1.5 cm，
% 所以应该是 2.54cm - 0.8cm - 0.24cm = 1.5cm
%
%    \begin{macrocode}
\geometry{
  paper      = a4paper,
  vmargin    = 2.54cm,
  hmargin    = 3.17cm,
  headheight = 0.75cm,
  headsep    = 0.29cm,
  footskip   = 0.79cm,
}
%    \end{macrocode}
%
% 使用 \pkg{fancy} 需要先调用 |\pagestyle{fancy}| 再修改 \cs{chaptermark} 和
% \cs{sectionmark}。
%    \begin{macrocode}
\pagestyle{fancy}
\let\sectionmark\@gobble
\renewcommand\headrulewidth{0.4\p@}
%    \end{macrocode}
%
% 使用 \pkg{ctex} 的 \cs{ctex\_patch\_cmd:Nnn} 命令。
%    \begin{macrocode}
\newcommand\ustc@patchcmd{\csname ctex_patch_cmd:Nnn\endcsname}
%    \end{macrocode}
%
% 页眉与该部分的章标题相同，宋体 10.5 磅（五号）居中。
% 页码：宋体 10.5 磅、页面下脚居中。
%    \begin{macrocode}
\ifustc@degree@graduate
  \newcommand\ustc@hf@font{\fontsize{10.5\bp@}{12\bp@}\selectfont}
  \newcommand\ustc@header{\leftmark}
  \ustc@patchcmd\chaptermark{\MakeUppercase}{}
  \ustc@patchcmd\chaptermark{#1}{\ustc@spacetitle{#1}}
%    \end{macrocode}
%
% 本科生要求除封面、扉页外，每面上部加页眉，
% 用小 5 号字（9 bp）标注“中国科学技术大学本科毕业论文”，居中；
% 从目录页开始在每面底部居中用小五宋体（9 bp）连续编页码。
%    \begin{macrocode}
\else
  \newcommand\ustc@hf@font{\fontsize{9\bp@}{12\bp@}\selectfont}
  \newcommand\ustc@header{中国科学技术大学本科毕业论文}
  \let\chaptermark\@gobble
\fi
%    \end{macrocode}
%
% 重定义默认的 |plain| page style，会显示页眉和页脚。
%    \begin{macrocode}
\fancypagestyle{plain}{%
  \fancyhf{}%
  \fancyhead[C]{\ustc@hf@font\ustc@header}%
  \fancyfoot[C]{\ustc@hf@font\thepage}%
}
\pagestyle{plain}
%    \end{macrocode}
%
% |headings| 只有页眉，没有页脚，用于研究生的符号说明和本科生的 front matter。
%    \begin{macrocode}
\fancypagestyle{headings}{\fancyfoot{}}
%    \end{macrocode}
%
% 每章第一页默认会设置特殊的 page style，我们希望它不改变页眉页脚，
% 所以定义一个 |none|。
%    \begin{macrocode}
\def\ps@none{}
\ctexset{chapter/pagestyle=none}
%    \end{macrocode}
%
% \begin{macro}{\cleardoublepage}
% 空白页不加页眉和页码。
%    \begin{macrocode}
\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
  \hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\frontmatter}
% 研究生要求从“中文摘要”开始页码用大写罗马数字，
% 而本科生的 frontmatter（只有致谢）不编页码，从目录开始页码用阿拉伯数字。
%    \begin{macrocode}
\renewcommand\frontmatter{%
  \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{Roman}%
  \ifustc@degree@graduate
    \pagestyle{plain}%
  \else
    \pagestyle{headings}%
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\mainmatter}
% 研究生要求“第 1 章”要另页起，但是本科生要求另面起。
%    \begin{macrocode}
\renewcommand\mainmatter{%
  \ifustc@degree@graduate
    \cleardoublepage
    \pagenumbering{arabic}%
  \else
    \clearpage
  \fi
  \pagestyle{plain}%
  \@mainmattertrue}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{封面}
%
% \begin{macro}{\maketitle}
%
% 定义用户接口：
%    \begin{macrocode}
\ustc@define@key{
  title = {
    default = {论文题目},
  },
  title* = {
    default = {Title},
    name    = title@en,
  },
  author = {
    default = {作者姓名},
  },
  author* = {
    default = {Author Name},
    name    = author@en,
  },
  speciality = {
    default = {专业},
  },
  speciality* = {
    default = {Speciality},
    name    = speciality@en,
  },
  supervisor = {
    default = {导师姓名},
  },
  supervisor* = {
    default = {Supervisor Name},
    name    = supervisor@en,
  },
  date = {
    default = {\the\year-\two@digits{\month}-\two@digits{\day}},
  },
  professional-type = {
    name = professional@type,
  },
  professional-type* = {
    name = professional@type@en,
  },
  secret-level = {
    name    = secret@level,
  },
  secret-level* = {
    name    = secret@level@en,
  },
  secret-year = {
    name    = secret@year,
  },
  keywords,
  keywords* = {
    name    = keywords@en,
  },
}
%    \end{macrocode}
%
% \begin{macro}{\ustc@clist@use}
% 导师一栏可能有多个姓名，所以用 \opt{supervisor} 进行收集，
% 然后使用本命令来输出要求的格式，
% 类似于 \LaTeX3 的 \cs{clist\_use:Nn}。
%    \begin{macrocode}
\newcommand\ustc@clist@count[1]{%
  \csname clist_count:N\endcsname{#1}%
}
\newcommand\ustc@clist@use[2]{%
  \csname clist_use:Nn\endcsname{#1}{#2}%
}
\newcommand\ustc@supervisor@names{%
  \ustc@clist@use{\ustc@supervisor}{\quad}
}
\newcounter{ustc@count}
\newcommand\ustc@supervisor@en@line{%
  \setcounter{ustc@count}{\ustc@clist@count{\ustc@supervisor@en}}%
  \ifnum\c@ustc@count>1\relax
    Supervisors:%
  \else
    Supervisor:%
  \fi
  \space\ustc@clist@use{\ustc@supervisor@en}{, }%
}
%    \end{macrocode}
% \end{macro}
%
% 输出日期的给定格式：\cs{ustc@format@date}\marg{format}\marg{date}，
% 其中格式 \meta{format} 接受三个参数分别对应年、月、日，
% \meta{date} 是 ISO 格式的日期（yyyy-mm-dd）。
%    \begin{macrocode}
\newcommand\ustc@format@date[2]{%
  \edef\ustc@@date{#2}%
  \def\ustc@@process@date##1-##2-##3\@nil{%
    #1{##1}{##2}{##3}%
  }%
  \expandafter\ustc@@process@date\ustc@@date\@nil
}
\newcommand\ustc@date@format@zh[3]{\zhdigits{#1}年\zhnumber{#2}月\zhnumber{#3}日}
\newcommand\ustc@date@month[1]{%
  \ifcase\number#1\or
    January\or February\or March\or April\or May\or June\or
    July\or August\or September\or October\or November\or December%
  \fi
}
\newcommand\ustc@date@format@en[3]{\ustc@date@month{#2} \number#3, #1}
\newcommand\ustc@date@zh{\ustc@format@date{\ustc@date@format@zh}{\ustc@date}}
\newcommand\ustc@date@en{\ustc@format@date{\ustc@date@format@en}{\ustc@date}}
%    \end{macrocode}
%
% 版本 v3.2 开始使用 \cs{ustcsetup} 设置接口，
% 兼容旧版本的命令式设置。
%    \begin{macrocode}
% Reserved for compatibility until 2020-07-01.
\def\ustc@define@term#1#2{%
  \expandafter\gdef\csname #1\endcsname##1{%
    \ustcsetup{#2 = {##1}}%
  }%
}
\ustc@define@term{title}{title}
\ustc@define@term{entitle}{title*}
\ustc@define@term{author}{author}
\ustc@define@term{enauthor}{author*}
\ustc@define@term{major}{speciality}
\ustc@define@term{enmajor}{speciality*}
\ustc@define@term{supervisor}{supervisor}
\ustc@define@term{ensupervisor}{supervisor*}
\gdef\cosupervisor#1{%
  \g@addto@macro\ustc@supervisor{, #1}%
}
\gdef\encosupervisor#1{%
  \g@addto@macro\ustc@supervisor@en{, #1}%
}
\gdef\date#1{\renewcommand\ustc@date@zh{#1}}
\gdef\endate#1{\renewcommand\ustc@date@en{#1}}
\ustc@define@term{professionaltype}{professional-type}
\ustc@define@term{enprofessionaltype}{professional-type*}
\ustc@define@term{secretlevel}{secret-level}
\ustc@define@term{ensecretlevel}{secret-level*}
\ustc@define@term{secretyear}{secret-year}
\gdef\keywords#1{\renewcommand\ustc@keywords@text{#1}}
\gdef\enkeywords#1{\renewcommand\ustc@keywords@en@text{#1}}
%    \end{macrocode}
%
% 定义一些常量。
%    \begin{macrocode}
\ifustc@degree@doctor
  \newcommand\ustc@thesis@name{博士学位论文}
  \newcommand\ustc@thesis@name@en{A dissertation for doctor's degree}
\else
  \ifustc@degree@master
    \newcommand\ustc@thesis@name{硕士学位论文}
    \newcommand\ustc@thesis@name@en{A dissertation for master's degree}
  \else
    \newcommand\ustc@thesis@name{学士学位论文}
    \newcommand\ustc@thesis@name@en{A dissertation for bachelor's degree}
  \fi
\fi
\ifustc@degree@type@academic
  \newcommand\ustc@speciality@name{学科专业}
\else
  \ifustc@degree@doctor
    \renewcommand\ustc@thesis@name{专业博士学位论文}
  \else
    \renewcommand\ustc@thesis@name{专业硕士学位论文}
  \fi
  \ifustc@cjk@font@mac
    \providecommand\lishu{\CJKfamily{zhli}}
  \else
    \ifustc@cjk@font@windows
      \setCJKfamilyfont{zhli}{LiSu}
      \providecommand\lishu{\CJKfamily{zhli}}
    \else
      \ustc@warning{LiShu font is required}
      \providecommand\lishu{\sffamily}
    \fi
  \fi
  \newcommand\ustc@speciality@name{专业领域}
\fi
%    \end{macrocode}
%
% 定义校徽颜色
%    \begin{macrocode}
\definecolor{ustcblue}{cmyk}{1,0.8,0,0}
%    \end{macrocode}
%
% \begin{macro}{\ustc@pdfbookmark}
% 添加 PDF 书签，在 \pkg{hyperref} 载入后才有效。
%    \begin{macrocode}
\newcommand\ustc@pdfbookmark{\@gobble}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{titlepage}
% 重定义 \env{titlepage} 环境，不修改页码。
%    \begin{macrocode}
\renewenvironment{titlepage}{%
  \cleardoublepage
  \if@twocolumn
    \@restonecoltrue\onecolumn
  \else
    \@restonecolfalse\newpage
  \fi
  \thispagestyle{empty}%
}{%
  \if@restonecol\twocolumn \else \newpage \fi
}
%    \end{macrocode}
% \end{environment}
%
% 中文封面：
% 密级仿宋 14 磅；
% 论文类型黑体 56 磅；
% 论文题目黑体 26 磅加粗居中，单倍行距；
% 作者姓名宋体 16 磅，单倍行距；
% 注意这里的“单倍行距”的地方开启了“对齐到网格”，所以实际行距有所偏差，
% 所以只能使用直尺测量。
%    \begin{macrocode}
\newcommand\ustc@makezhtitle{%
  \ustc@setchinese
  \begin{titlepage}%
    \ustc@pdfbookmark{封面}%
    \centering
    \parbox[t][0.6cm][t]{\textwidth}{%
      \raggedleft\fangsong\fontsize{14\bp@}{14\bp@}\selectfont
      \null\ustc@secret@level\par}\par
    \vskip 0.5cm%
    \includegraphics[height=1.3cm]{figures/ustc-name.pdf}\par
    \vskip 0.6cm%
    {\sffamily\fontsize{56\bp@}{56\bp@}\selectfont
      \ustc@thesis@name\par}%
    \ifustc@degree@type@academic
      \vskip 2.0cm%
    \else
      \vskip 0.8cm%
      {\lishu\fontsize{26\bp@}{26\bp@}\selectfont
        （\ustc@professional@type）\par}%
      \vskip 1.0cm%
    \fi
    \ifustc@badge@color@blue
      \textcolor{ustcblue}{%
        \includegraphics[height=4.1cm]{figures/ustc-badge.pdf}}%
    \else
      \includegraphics[height=4.1cm]{figures/ustc-badge.pdf}%
    \fi\par
    \vskip 0.9cm%
    \parbox[t][3.5cm][c]{\textwidth}{%
      \centering\sffamily\bfseries\fontsize{26\bp@}{50\bp@}\selectfont
      \ustc@title\par}\par
    \vskip 0.6cm%
    {\fontsize{16\bp@}{31\bp@}\selectfont
      \begin{tabular}{@{}l@{\hspace{\ccwd}}l@{}}%
        \textsf{作者姓名：} & \ustc@author \\
        \textsf{\ustc@speciality@name：} & \ustc@speciality \\
        \textsf{导师姓名：} & \ustc@supervisor@names \\
        \textsf{完成时间：} & \ustc@date@zh
      \end{tabular}\par}%
  \end{titlepage}%
  \ustc@setdefaultlanguage
}
%    \end{macrocode}
%
% 英文封面
%    \begin{macrocode}
\newcommand\ustc@makeentitle{%
  \ustc@setenglish
  \begin{titlepage}%
    \ustc@pdfbookmark{Title page}%
    \centering
    \parbox[t][0.4cm][t]{\textwidth}{%
      \raggedleft\fontsize{14\bp@}{14\bp@}\selectfont
      \null\ustc@secret@level@en\par}\par
    \vskip 0.5cm%
    {\sffamily\fontsize{20\bp@}{30\bp@}\selectfont
      University of Science and Technology of China\par}%
    {\sffamily\fontsize{26\bp@}{30\bp@}\selectfont
      \ustc@thesis@name@en\par}%
    \ifustc@degree@type@academic\else
      {\fontsize{16\bp@}{32\bp@}\selectfont
        (\ustc@professional@type@en)\par}%
    \fi
    \vskip 2.5cm%
    \ifustc@badge@color@blue
      \textcolor{ustcblue}{%
        \includegraphics[height=4.5cm]{figures/ustc-badge.pdf}}%
    \else
      \includegraphics[height=4.5cm]{figures/ustc-badge.pdf}%
    \fi\par
    \vskip 0.5cm%
    \parbox[t][4.5cm][c]{\textwidth}{%
      \centering\sffamily\bfseries\fontsize{26\bp@}{30\bp@}\selectfont
      \ustc@title@en\par}\par
    \vskip 1.6cm%
    {\fontsize{16\bp@}{30\bp@}\selectfont
      \begin{tabular}{@{}l@{}}%
        Author:        \ustc@author@en \\
        Speciality:    \ustc@speciality@en \\
        \ustc@supervisor@en@line \\
        Finished time: \ustc@date@en
      \end{tabular}\par}%
  \end{titlepage}%
  \ustc@setdefaultlanguage
}
%    \end{macrocode}
%
% 重新定义 \cs{maketitle}，调用 \cs{ustc@makezhtitle}, \cs{ustc@makeentitle}
% 分别生成中、英文封面。
%    \begin{macrocode}
\renewcommand\maketitle{%
  \newgeometry{margin=2.54cm}%
  \pagenumbering{Alph}%
  \pagestyle{empty}%
  \ustc@makezhtitle
  \ustc@makeentitle
  \restoregeometry
  \pagestyle{plain}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{原创性声明}
%
% 定义原创性声明
%    \begin{macrocode}
\newcommand\ustc@originality{%
  本人声明所呈交的学位论文，是本人在导师指导下进行研究工作所取得的成果。%
  除已特别加以标注和致谢的地方外，论文中不包含任何他人已经发表或撰写过的%
  研究成果。%
  与我一同工作的同志对本研究所做的贡献均已在论文中作了明确的说明。}
\newcommand\ustc@authorization{%
  作为申请学位的条件之一，学位论文著作权拥有者授权中国科学技术大学拥有%
  学位论文的部分使用权，%
  即：学校有权按有关规定向国家有关部门或机构送交论文的复印件和电子版，%
  允许论文被查阅和借阅，可以将学位论文编入《中国学位论文全文数据库》等%
  有关数据库进行检索，可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。%
  本人提交的电子文档的内容和纸质论文的内容相一致。\par
  保密的学位论文在解密后也遵守此规定。}
%    \end{macrocode}
%
% \begin{macro}{\ustc@underline}
% 生成空的下划线
%    \begin{macrocode}
\newcommand\ustc@underline[2][3.2cm]{\underline{\hb@xt@ #1{\hss#2\hss}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ustc@checkbox}
%    \begin{macrocode}
\newcommand\ustc@checkbox{%
  \makebox[\z@][l]{$\square$}%
  \raisebox{-0.2ex}{\hspace{0.1em}$\checkmark$}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\copyrightpage}
%    \begin{macrocode}
\newcommand\copyrightpage{%
  \begin{titlepage}%
    \ustc@pdfbookmark{原创性和授权使用声明}%
    \null
    \vskip 0.3cm%
    {\centering\sffamily\fontsize{16\bp@}{32\bp@}\selectfont
      中国科学技术大学学位论文原创性声明\par}%
    \vskip 0.7cm%
    \ustc@originality\par
    \vskip 1.3cm%
    作者签名：\ustc@underline{}\hspace{2.7cm}%
    签字日期：\ustc@underline{}\par
    \vskip 1.9cm%
    {\centering\sffamily\fontsize{16\bp@}{32\bp@}\selectfont
      中国科学技术大学学位论文授权使用声明\par}%
    \vskip 0.7cm%
    \ustc@authorization\par
    \vskip 0.6cm%
    \ifx\ustc@secret@level\@empty
      \ustc@checkbox{} 公开\quad
      $\square$ 保密（\ustc@underline[0.85cm]{}年）\par
    \else
      $\square$ 公开\quad
      \ustc@checkbox{} 保密（\ustc@underline[0.8cm]{\ustc@secret@year}年）\par
    \fi
    \vskip 0.5cm%
    作者签名：\ustc@underline{}\hspace{2.7cm}%
    导师签名：\ustc@underline{}\par
    \vskip 0.5cm%
    签字日期：\ustc@underline{}\hspace{2.7cm}%
    签字日期：\ustc@underline{}\par
  \end{titlepage}%
}
\ifustc@degree@bachelor
  \let\copyrightpage\relax
\fi
% Reserved for compatibility until 2020-07-01.
\let\makestatement\copyrightpage
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{章节标题}
%
% 标题最多允许使用五级。
%    \begin{macrocode}
\setcounter{secnumdepth}{5}
%    \end{macrocode}
%
% \begin{macro}{\ustc@spacetitle}
% 研究生规定章题为两字时中间空两字，三字时空一字，四字时空半字，四字以上不空。
% 这里用 \LaTeX3 的 \cs{str\_count:N} 判断字数。
% 注意，\pkg{stringstrings} 宏包会导致范数命令 \verb+\|+ 被修改。
%    \begin{macrocode}
\newcount\ustc@titlelength
\DeclareRobustCommand\ustc@spacetitle[1]{%
  \ustc@titlelength=\csname str_count:N\endcsname{#1}%
  \begingroup
    \ifustc@degree@graduate
      \ifcase\ustc@titlelength
      \or\or
        \ziju{2}%
      \or
        \ziju{1}%
      \or
        \ziju{0.5}%
      \fi
    \else
      \if@mainmatter\else
        \ifcase\ustc@titlelength
        \or\or
          \ziju{1}%
        \or\or
          \ziju{0.5}%
        \fi
      \fi
    \fi
    #1%
  \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ustc@textcircled}
% 五级节标题和脚注需要使用带圈的数字，这里使用 \cs{ustc@circlefont} ：
%    \begin{macrocode}
\newcommand\ustc@textcircled[1]{%
  \ifnum\value{#1}<21\relax
    {\ustc@circlefont\symbol{\numexpr\value{#1} + "245F\relax}}%
  \else
    \ustc@error{Cannot display more than 10 footnotes}%
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% 用 \pkg{ctex} 的接口设置全部章节标题格式。
%
% 各章标题：黑体 16 磅加粗居中，单倍行距，段前 24 磅，段后 18 磅，
% 章序号与章名间空一字。
%
% 由于 Word 模板中使用“单倍行距”，还“对齐到网格”，这在 TeX 中不容易实现。
% 所以目前按照默认的行距。
%
% 注意 \pkg{ctex} v2.4.3 以下版本的bug会导致章节标题前后的距离的实际值偏大。
% 另外 \pkg{ctex} v2.2 前的beforeskip的符号有特殊意义。
%    \begin{macrocode}
\ctexset{
  chapter = {
    format      = \centering\sffamily\bfseries\fontsize{16\bp@}{26.67\bp@}\selectfont,
    nameformat  = {},
    titleformat = \ustc@spacetitle,
    number      = \thechapter,
    aftername   = \hspace{\ccwd},
    beforeskip  = 24\bp@,
    afterskip   = 18\bp@,
    fixskip     = true,
  },
}
%    \end{macrocode}
%
% 一级节标题：黑体 14 磅左顶格，单倍行距，段前 24 磅，段后 6 磅，
% 序号与题名间空一字。
%    \begin{macrocode}
\ctexset{
  section = {
    format     = \sffamily\fontsize{14\bp@}{23.33\bp@}\selectfont,
    aftername  = \hspace{\ccwd},
    beforeskip = 24\bp@,
    afterskip  = 6\bp@,
  },
%    \end{macrocode}
%
% 二级节标题：黑体 13 磅，左缩进两字，单倍行距，段前 12 磅，段后 6 磅，
% 序号与题名间空一字。
%    \begin{macrocode}
  subsection = {
    format     = \sffamily\fontsize{13\bp@}{21.67\bp@}\selectfont,
    aftername  = \hspace{\ccwd},
    indent     = 2\ccwd,
    beforeskip = 12\bp@,
    afterskip  = 6\bp@,
  },
%    \end{macrocode}
%
% 三级及以下节标题的格式没有具体规定，按照 Word 模板的格式：
% 使用黑体 12 磅，左缩进两字，行距 20 磅，段前段后 0 磅，序号与题名间空半字宽。
%    \begin{macrocode}
  subsubsection = {
    format     = \sffamily\fontsize{12\bp@}{20\bp@}\selectfont,
    number     = \arabic{subsubsection},
    aftername  = .\hspace{0.5\ccwd},
    indent     = 2\ccwd,
    beforeskip = \z@,
    afterskip  = \z@,
  },
%    \end{macrocode}
%
% 按照 Word 模板的格式，四级节标题：宋体 12 磅，左缩进两字，行距 20 磅，
% 段前段后 0 磅，序号使用全宽括号，与题名间空半字宽。
%    \begin{macrocode}
  paragraph = {
    format     = \rmfamily\fontsize{12\bp@}{20\bp@}\selectfont,
    number     = （\arabic{paragraph}）,
    aftername  = \hspace{0.5\ccwd},
    indent     = 2\ccwd,
    beforeskip = \z@,
    afterskip  = \z@,
    runin      = false,
  },
%    \end{macrocode}
%
% 按照 Word 模板的格式，五级节标题：宋体 12 磅，左缩进两字，行距 20 磅，
% 段前段后 0 磅，序号使用全宽括号，与题名间空半字宽。
%    \begin{macrocode}
  subparagraph = {
    format     = \rmfamily\fontsize{12\bp@}{20\bp@}\selectfont,
    number     = \ustc@textcircled{subparagraph},
    aftername  = \hspace{0.5\ccwd},
    indent     = 2\ccwd,
    beforeskip = \z@,
    afterskip  = \z@,
    runin      = false,
  },
}
%    \end{macrocode}
%
% 在研究生格式的基础上再设置本科生的章节标题格式。
%    \begin{macrocode}
\ifustc@degree@bachelor
  \setcounter{secnumdepth}{4}
  \ctexset{
%    \end{macrocode}
%
% 论文的致谢、目录、摘要和参考文献等标题用小二号（18 bp）黑体字，居中，
% 这通过 \cs{if@mainmatter} 区分。
% 正文中的标题分章、节、段三级；章、节标题居中，段标题居左，
% 分别用三号（16 bp）黑体、小三（15 bp）黑体、四号（14 bp）黑体。
%    \begin{macrocode}
    chapter = {
      format = {
        \centering\sffamily
        \if@mainmatter
          \fontsize{16\bp@}{29.33\bp@}\selectfont
        \else
          \fontsize{18\bp@}{33\bp@}\selectfont
        \fi
      },
    },
    section = {
      format = \centering\sffamily\fontsize{15\bp@}{27.5\bp@}\selectfont,
    },
    subsection = {
      format    = \sffamily\fontsize{14\bp@}{25.67\bp@}\selectfont,
      indent    = \z@,
    },
    subsubsection = {
      format    = \rmfamily\fontsize{12\bp@}{22\bp@}\selectfont,
      indent    = \ccwd,
    },
    paragraph = {
      format    = \rmfamily\fontsize{12\bp@}{22\bp@}\selectfont,
      aftername = {},
      indent    = \ccwd,
    },
  }
%    \end{macrocode}
%
% 本科生的阿拉伯数字式标题的格式与研究生几乎一致，只有中文数字式需要修改。
%    \begin{macrocode}
  \ifustc@section@style@arabic\else
    \ctexset{
      chapter = {
        number = \chinese{chapter},
      },
      section = {
        name   = {第,节},
        number = \chinese{section},
      },
      subsection = {
        number    = \chinese{subsection},
        aftername = {、},
      },
    }
  \fi
\fi
%    \end{macrocode}
%
% \begin{macro}{\ustc@chapter}
% 默认的 \cs{chapter*} 生成的章标题没有编号、不更改页眉，
% 也不添加进目录或 PDF 书签。
% 然而像摘要、目录、符号说明这样的章节，它们不需要编号、不加入目录，
% 但是需要修改页眉，并且加入 PDF 标签。
% 所以我们新定义 \cs{ustc@chapter} 用于处理这些章节。%
%    \begin{macrocode}
\NewDocumentCommand\ustc@chapter{o m}{%
  \if@openright\cleardoublepage\else\clearpage\fi
  \IfValueTF{#1}{%
    \ustc@pdfbookmark{#1}%
    \chaptermark{#1}%
  }{%
    \ustc@pdfbookmark{#2}%
    \chaptermark{#2}%
  }%
  \chapter*{#2}}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{摘要}
%
% \begin{environment}{abstract}
% 中文摘要环境。
% 判断 \cs{ustc@tocloaded} 是为了防止本科生未调整摘要位置时的目录页码缺失。
%    \begin{macrocode}
\newcommand\ustc@keywords@text{%
  \ustc@clist@use{\ustc@keywords}{；}%
}
\newcommand\ustc@keywords@en@text{%
  \ustc@clist@use{\ustc@keywords@en}{; }%
}
\newenvironment{abstract}{%
  \ustc@setchinese
  \ifustc@degree@graduate
    \ustc@chapter{摘要}%
  \else
    \chapter{中文内容摘要}%
    \ifustc@tocloaded\else
      本科生需要手动将摘要置于目录后。\par
    \fi
  \fi
}{
  \par\null\par\noindent\hangindent=4\ccwd\relax
  \textbf{关键词}：\ustc@keywords@text\par
  \ustc@setdefaultlanguage
}
%    \end{macrocode}
% \end{environment}
%
% \begin{environment}{enabstract}
% 英文摘要环境
%    \begin{macrocode}
\newenvironment{enabstract}{%
  \ustc@setenglish
  \ifustc@degree@graduate
    \ustc@chapter[Abstract]{ABSTRACT}%
  \else
    \chapter[英文内容摘要]{Abstract}%
  \fi
}{
  \par\null\par\noindent\hangindent=5.3em\relax
  \textbf{Key Words}: \ustc@keywords@en@text\par
  \ifustc@degree@graduate
    \cleardoublepage
  \fi
  \ustc@setdefaultlanguage
}
%    \end{macrocode}
% \end{environment}
%
%
% \subsection{目录}
%
% 判断是否已经加载目录，用于提醒本科生更改摘要和致谢的顺序。
%    \begin{macrocode}
\newif\ifustc@tocloaded
%    \end{macrocode}
%
% \begin{macro}{\tableofcontents}
% 研究生规定目录另面起；
% 本科生规定从目录开始编页码，所以必须另页起。
%    \begin{macrocode}
\renewcommand\tableofcontents{%
  \ifustc@degree@bachelor
    \cleardoublepage
    \pagenumbering{arabic}%
    \pagestyle{plain}%
    \ustc@tocloadedtrue
  \fi
  \ustc@chapter{\contentsname}%
  \@starttoc{toc}%
}
%    \end{macrocode}
% \end{macro}
%
% 下面用 \pkg{titletoc} 宏包设置目录内容的格式。
% 先定义目录线：
%    \begin{macrocode}
\newcommand\ustc@leaders{\titlerule*[9\bp@]{\textperiodcentered}}
%    \end{macrocode}
%
% 各章目录要求宋体 14 磅，单倍行距，段前 6 磅，段后 0 磅，两端对齐，
% 页码右对齐，章序号与章名间空一字。
% 但是 Word 模板中实际是行距 20 磅。
%
% 另外 \pkg{ctex} 在章目录的序号后加 |\hspace{.3em}|，所以用 \cs{unskip} 修正。
%    \begin{macrocode}
\ifustc@degree@graduate
  \titlecontents{chapter}
    [\z@]{\addvspace{6\bp@}\fontsize{14\bp@}{20\bp@}\selectfont}
    {\contentspush{\thecontentslabel\unskip\hspace{\ccwd}}}{}
    {\fontsize{12\bp@}{20\bp@}\selectfont\ustc@leaders\contentspage}
%    \end{macrocode}
%
% 一级节标题目录要求宋体 12 磅，单倍行距，左缩进一字，段前 6 磅，段后 0 磅，
% 两端对齐，页码右对齐，序号与题名间空一字。
% Word 模板中实际是行距 20 磅，段前 0 磅。
%    \begin{macrocode}
  \titlecontents{section}
    [\ccwd]{\fontsize{12\bp@}{20\bp@}\selectfont}
    {\contentspush{\thecontentslabel\hspace{\ccwd}}}{}
    {\fontsize{12\bp@}{20\bp@}\selectfont\ustc@leaders\contentspage}
%    \end{macrocode}
%
% 二级节标题目录要求宋体 10.5 磅，单倍行距，左缩进两字，段前 6 磅，段后 0 磅，
% 两端对齐，页码右对齐，序号与题名间空一字。
% Word 模板中实际是行距 20 磅，段前 0 磅。
%    \begin{macrocode}
  \titlecontents{subsection}
    [2\ccwd]{\fontsize{10.5\bp@}{20\bp@}\selectfont}
    {\contentspush{\thecontentslabel\hspace{\ccwd}}}{}
    {\fontsize{12\bp@}{20\bp@}\selectfont\ustc@leaders\contentspage}
%    \end{macrocode}
%
% 本科生的目录使用小四宋体（同正文字体），其他同研究生的格式相近。
%    \begin{macrocode}
\else
  \titlecontents{chapter}
    [\z@]{\normalsize}
    {\contentspush{\thecontentslabel\unskip\hspace{\ccwd}}}{}
    {\ustc@leaders\contentspage}
  \titlecontents{section}
    [\ccwd]{\normalsize}
    {\contentspush{\thecontentslabel\hspace{\ccwd}}}{}
    {\ustc@leaders\contentspage}
  \titlecontents{subsection}
    [2\ccwd]{\normalsize}
    {\contentspush{\thecontentslabel
      \ifustc@section@style@arabic\hspace{\ccwd}\else 、\fi}}{}
    {\ustc@leaders\contentspage}
\fi
%    \end{macrocode}
%
% 本科生要求目录中正文每章前多空一行，而目录、附录等章则不需要空行，
% 所以不能简单判断 \cs{if@mainmatter}，需要重新定义 \cs{mainmatter} 等命令。
%    \begin{macrocode}
\newif\ifustc@addtocspace
\ifustc@degree@bachelor
  \ustc@addtocspacetrue
  \g@addto@macro\frontmatter{\ustc@addtocspacefalse}%
  \g@addto@macro\mainmatter{\ustc@addtocspacetrue}%
  \g@addto@macro\backmatter{\ustc@addtocspacefalse}%
  \g@addto@macro\appendix{\ustc@addtocspacefalse}%
\fi
%    \end{macrocode}
%
% \begin{macro}{\chapter}
% 处理本科生在目录中添加空行。
%    \begin{macrocode}
\renewcommand\chapter{%
  \if@openright\cleardoublepage\else\clearpage\fi
  \thispagestyle{\CTEX@chapter@pagestyle}%
  \global\@topnum\z@
  \@afterindenttrue
  \ifustc@degree@bachelor
    \ifustc@addtocspace
      \addtocontents{toc}{\protect\addvspace{12\bp@}}%
    \fi
  \fi
  \secdef\@chapter\@schapter
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listoffigures}
% 研究生要求图、表的清单须另页起。
%    \begin{macrocode}
\renewcommand\listoffigures{%
  \ifustc@degree@graduate
    \cleardoublepage
  \fi
  \ustc@chapter{\listfigurename}%
  \@starttoc{lof}%
}
\titlecontents{figure}
  [2.3em]{\normalsize}
  {\contentslabel{2.3em}}{}
  {\ustc@leaders\contentspage}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listoftables}
%    \begin{macrocode}
\renewcommand\listoftables{%
  \ifustc@degree@graduate
    \cleardoublepage
  \fi
  \ustc@chapter{\listtablename}%
  \@starttoc{lot}%
}
\titlecontents{table}
  [2.3em]{\normalsize}
  {\contentslabel{2.3em}}{}
  {\ustc@leaders\contentspage}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{符号说明}
%
% \begin{environment}{notation}
% 研究生规定符号说明另页起，标题字体字号等同论文正文，
% 《撰写手册》第 9 页 1.10(2) 还规定“符号说明不加页码”。
%    \begin{macrocode}
\newenvironment{notation}{%
  \ifustc@degree@graduate
    \cleardoublepage
    \pagestyle{headings}%
  \fi
  \ustc@chapter{\ustc@notation@name}%
}{%
  \ifustc@degree@graduate
    \clearpage
    \pagestyle{plain}%
  \fi
}%
\newcommand*\notationlabel[1]{#1\hfil}%
\newenvironment{notationlist}[1]{%
  \list{}{%
    \itemsep 3pt%
    \labelwidth #1\relax%
    \labelsep 1em%
    \leftmargin\labelwidth
    \advance\leftmargin\labelsep
    \advance\leftmargin 3em%
    \rightmargin 3em%
    \let\makelabel\notationlabel
  }%
}{%
  \endlist
}
%    \end{macrocode}
% \end{environment}
%
%
% \subsection{正文}
%
% \cs{sloppy} 可以减少“overfull boxes”。
%    \begin{macrocode}
\sloppy
%    \end{macrocode}
%
% 禁止扩大段间距。（\href{https://github.com/ustctug/ustcthesis/issues/209}{
%   ustctug/ustcthesis\#209}）
%    \begin{macrocode}
\raggedbottom
%    \end{macrocode}
%
% 段间距 0 磅。
%    \begin{macrocode}
\setlength{\parskip}{\z@}
%    \end{macrocode}
%
% 在 \opt{scheme=plain} 时也首段缩进。
%    \begin{macrocode}
\let\@afterindentfalse\@afterindenttrue
\@afterindenttrue
%    \end{macrocode}
%
% URL 的字体设为保持原样。
%    \begin{macrocode}
\urlstyle{same}
%    \end{macrocode}
%
% 使用 \pkg{xurl} 宏包的方法，增加 URL 可断行的位置。
%    \begin{macrocode}
\def\UrlBreaks{%
  \do\/%
  \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l%
     \do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z%
  \do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L%
     \do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z%
  \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9\do=\do/\do.\do:%
  \do\*\do\-\do\~\do\'\do\"\do\-}
\Urlmuskip=0mu plus 0.1mu
%    \end{macrocode}
%
% \begin{macro}{\footnote}
% 脚注用带圈的数字：
%    \begin{macrocode}
\renewcommand\thefootnote{\ustc@textcircled{footnote}}
%    \end{macrocode}
%
% LaTeX 默认脚注按章计数，即每章的开始才重置脚注计数器；我们修改为按页计数。
% 简单的|\@addtoreset{footnote}{page}|并不可靠，
% \footnote{\url{https://texfaq.org/FAQ-footnpp.html}}
% 所以我们使用 \pkg{footmisc} 宏包。
%
% 脚注线长为版心宽度的四分之一：
%    \begin{macrocode}
\renewcommand\footnoterule{%
  \kern-3\p@
  \hrule\@width.25\textwidth
  \kern2.6\p@}
%    \end{macrocode}
%
% 注文缩进两字：
%    \begin{macrocode}
\renewcommand\@makefntext[1]{%
  \parindent 2\ccwd\relax
  \noindent
  \hb@xt@2\ccwd{\hss\@makefnmark}#1}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{列表}
% \label{sec:list}
%
% \begin{environment}{enumerate}
% \begin{environment}{description}
% \begin{environment}{itemize}
% 调整列表中各项之间过大的间距。
%    \begin{macrocode}
\setlength\partopsep{\z@}
\newcommand\ustc@nolistsep{%
  \parsep 0\p@ \@plus.2\p@
  \topsep 0\p@ \@plus.2\p@
  \itemsep0\p@ \@plus.2\p@
}
\def\@listi{\leftmargin\leftmargini
            \ustc@nolistsep}
\let\@listI\@listi
\@listi
\def\@listii {\leftmargin\leftmarginii
              \labelwidth\leftmarginii
              \advance\labelwidth-\labelsep
              \ustc@nolistsep}
\def\@listiii{\leftmargin\leftmarginiii
              \labelwidth\leftmarginiii
              \advance\labelwidth-\labelsep
              \ustc@nolistsep}
%    \end{macrocode}
% \end{environment}
% \end{environment}
% \end{environment}
%
%
% \subsection{浮动体}
%
% \LaTeX{} 对放置浮动体的要求比较强，这里按照 UK TeX FAQ 的建议
% \footnote{\url{https://texfaq.org/FAQ-floats}} 对其适当放宽。
%    \begin{macrocode}
\renewcommand\topfraction{.85}
\renewcommand\bottomfraction{.7}
\renewcommand\textfraction{.15}
\renewcommand\floatpagefraction{.66}
\renewcommand\dbltopfraction{.66}
\renewcommand\dblfloatpagefraction{.66}
\setcounter{topnumber}{9}
\setcounter{bottomnumber}{9}
\setcounter{totalnumber}{20}
\setcounter{dbltopnumber}{9}
%    \end{macrocode}
%
% 修改默认的浮动体描述符为 |htb|。
%    \begin{macrocode}
\def\fps@figure{htb}
\def\fps@table{htb}
%    \end{macrocode}
%
% 用 \pkg{caption} 宏包设置图、表的格式：
%
% 图号、图题置于图的下方，宋体 10.5 磅居中，单倍行距，段前 6 磅，段后 12 磅，
% 图号与图题文字之间空一字，图号、图题加粗。
% 图注位于图的下方，左缩进两字，续行悬挂缩进左对齐，两端对齐。
%
% 表号、表题置于表的上方，宋体 10.5 磅居中，单倍行距，段前 6 磅，段后 6 磅，
% 表号与表题文字之间空一字，表号、表题加粗。
% 表注左缩进两字，续行悬挂缩进左对齐，两端对齐。
%    \begin{macrocode}
\setlength{\floatsep}{6\bp@}
\setlength{\textfloatsep}{6\bp@}
\setlength{\intextsep}{6\bp@}
\DeclareCaptionLabelSeparator{zhspace}{\hspace{\ccwd}}
\captionsetup{
  format         = hang,
  font           = small,
  labelsep       = zhspace,
  skip           = 6\bp@,
  figureposition = bottom,
  tableposition  = top,
}
\ifustc@degree@graduate
  \captionsetup{font+=bf}
\fi
\captionsetup[figure]{
  belowskip = 6\bp@,
}
%    \end{macrocode}
%
% \begin{macro}{\note}
% 新定义了 \cs{note} 来生成图表的附注。
% 如果用 \cs{caption} 生成图表的附注会导致图表的序号有误；
% 如果用 \cs{bicaption} 会导致表注无法置于表后，而且对齐方式不对。
%    \begin{macrocode}
\newcommand\note[1]{%
  \begingroup
  \captionsetup{
    format        = plain,
    font          = small,
    justification = justified,
    margin        = 2\ccwd,
    position      = bottom,
  }%
  \caption*{#1}%
  \endgroup
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{数学符号}
%
% 根据中文的数学排印习惯进行设置：
%
% \begin{macro}{\ldots}
% 省略号一律居中，所以 \cs{ldots} 不再居于底部。
%    \begin{macrocode}
\ifustc@language@chinese
  \def\mathellipsis{\cdots}
\fi
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\le}
% \begin{macro}{\ge}
% 小于等于号、大于等于号要使用倾斜的字形。
%    \begin{macrocode}
\protected\def\le{\leqslant}
\protected\def\ge{\geqslant}
\AtBeginDocument{%
  \renewcommand\leq{\leqslant}%
  \renewcommand\geq{\geqslant}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\int}
% 积分号的上下限默认置于上下两侧。
%    \begin{macrocode}
\removenolimits{%
  \int\iint\iiint\iiiint\oint\oiint\oiiint
  \intclockwise\varointclockwise\ointctrclockwise\sumint
  \intbar\intBar\fint\cirfnint\awint\rppolint
  \scpolint\npolint\pointint\sqint\intlarhk\intx
  \intcap\intcup\upint\lowint
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Re}
% \begin{macro}{\Im}
% 实部、虚部操作符使用罗马体 $\mathrm{Re}$、$\mathrm{Im}$ 而不是 fraktur 体
% $\Re$、$\Im$。
%    \begin{macrocode}
\AtBeginDocument{%
  \renewcommand\Re{\operatorname{Re}}%
  \renewcommand\Im{\operatorname{Im}}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\nabla}
% \cs{nabla} 使用粗正体。
%    \begin{macrocode}
\AtBeginDocument{%
  \renewcommand\nabla{\mbfnabla}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bm}
% \begin{macro}{\boldsymbol}
% 兼容旧的粗体命令：\pkg{bm} 的 \cs{bm} 和 \pkg{amsmath} 的 \cs{boldsymbol}。
%    \begin{macrocode}
\DeclareRobustCommand\bm[1]{{\symbf{#1}}}
\DeclareRobustCommand\boldsymbol[1]{{\symbf{#1}}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\square}
% 兼容 \pkg{amssymb} 中的命令。
%    \begin{macrocode}
\newcommand\square{\mdlgwhtsquare}
%    \end{macrocode}
% \end{macro}
%
% 提供一些方便的命令：
%    \begin{macrocode}
\newcommand\upe{\symup{e}}
\newcommand\upi{\symup{i}}
\newcommand\dif{\mathop{}\!\mathrm{d}}
%    \end{macrocode}
%
%
% \subsection{参考文献}
%
% 定义几种引用文献的标注法。
%    \begin{macrocode}
\newcommand\bibstyle@super{%
  \bibpunct{[}{]}{,}{s}{,}{\textsuperscript{,}}%
  \gdef\NAT@sort{\@ne}%
  \gdef\NAT@cmprs{\@ne}%
}
\newcommand\bibstyle@inline{%
  \bibpunct{[}{]}{,}{n}{,}{,}%
  \gdef\NAT@sort{\@ne}%
  \gdef\NAT@cmprs{\@ne}%
}
\newcommand\bibstyle@authoryear{%
  \bibpunct{(}{)}{;}{a}{,}{,}%
  \gdef\NAT@sort{\z@}%
  \gdef\NAT@cmprs{\z@}%
}
%    \end{macrocode}
%
% 避免在 cite-style 接口的地方定义代码，
% 因为在导言区执行 \cs{citestyle} 会妨碍 \pkg{natbib} 的 \cs{bibstyle}
% 自动设置 \cs{citestyle}。
%    \begin{macrocode}
\ustc@option@hook{cite-style}{%
  \citestyle{\ustc@cite@style}%
}
%    \end{macrocode}
%
% 使用 \cs{bibliographystyle} 命令时自动切换为对应的引用风格。
%    \begin{macrocode}
\@namedef{bibstyle@ustcthesis-numerical}{\bibstyle@super}
\@namedef{bibstyle@ustcthesis-authoryear}{\bibstyle@authoryear}
\@namedef{bibstyle@ustcthesis-bachelor}{\bibstyle@super}
%    \end{macrocode}
%
% \begin{macro}{\inlinecite}
% 如果文献序号作为叙述文字的一部分，需要临时将文献序号与正文平排
%    \begin{macrocode}
\DeclareRobustCommand\inlinecite{\@inlinecite}
\def\@inlinecite#1{\begingroup\let\@cite\NAT@citenum\citep{#1}\endgroup}
%    \end{macrocode}
% \end{macro}
%
% 版本 v3.2 改为按照标准方式调用 \cs{bibliographystyle}
% 版本 v3.1.* 前要求用户不使用 \cs{bibliographystyle} 命令，
% 这与标准文档类不一致。
% 为了兼容版本进行一些修改：
%    \begin{macrocode}
% Reserved for compatibility until 2020-07-01.
\let\bibstyle@numbers\bibstyle@inline
\newif\ifustc@bib@style@written
\def\bibliography#1{%
  \ifustc@bib@style@written\else
    \ifustc@degree@bachelor
      \bibliographystyle{ustcthesis-bachelor}%
    \else
      \bibliographystyle{ustcthesis-numerical}%
    \fi
  \fi
  \if@filesw
    \immediate\write\@auxout{\string\bibdata{\zap@space#1 \@empty}}%
  \fi
  \@input@{\jobname.bbl}}
\def\bibliographystyle#1{%
  \ustc@bib@style@writtentrue
  \ifx\@begindocumenthook\@undefined\else
    \expandafter\AtBeginDocument
  \fi
    {\if@filesw
       \immediate\write\@auxout{\string\bibstyle{#1}}%
     \fi}}
\ifustc@legacy@cite@style
  \ifustc@degree@graduate
    \ifustc@cite@style@authoryear
      \citestyle{authoryear}
      \bibliographystyle{ustcthesis-authoryear}
    \else
      \ifustc@cite@style@super
        \citestyle{super}
      \else
        \citestyle{inline}
      \fi
      \bibliographystyle{ustcthesis-numerical}
    \fi
  \else
    \ifustc@cite@style@super
      \citestyle{super}
    \else
      \citestyle{numbers}
    \fi
    \bibliographystyle{ustcthesis-bachelor}
  \fi
\fi
%    \end{macrocode}
%
% \begin{macro}{\cite}
% 下面修改引用标注的格式，主要是将页码写在上标位置。
% Numerical 模式的 \cs{citet} 的页码：
%    \begin{macrocode}
\ustc@patchcmd{\NAT@citexnum}{%
  \@ifnum{\NAT@ctype=\z@}{%
    \if*#2*\else\NAT@cmt#2\fi
  }{}%
  \NAT@mbox{\NAT@@close}%
}{%
  \NAT@mbox{\NAT@@close}%
  \@ifnum{\NAT@ctype=\z@}{%
    \if*#2*\else\textsuperscript{#2}\fi
  }{}%
}
%    \end{macrocode}
%
% Numerical 模式的 \cs{citep} 的页码：
%    \begin{macrocode}
\renewcommand\NAT@citesuper[3]{\ifNAT@swa
\if*#2*\else#2\NAT@spacechar\fi
\unskip\kern\p@\textsuperscript{\NAT@@open#1\NAT@@close\if*#3*\else#3\fi}%
   \else #1\fi\endgroup}
\renewcommand\NAT@citenum%
    [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
        #1\NAT@@close\if*#3*\else\textsuperscript{#3}\fi\else#1\fi\endgroup}
%    \end{macrocode}
%
% Author-year 模式的 \cs{citet} 的页码：
%    \begin{macrocode}
\ustc@patchcmd{\NAT@citex}{%
  \if*#2*\else\NAT@cmt#2\fi
  \if\relax\NAT@date\relax\else\NAT@@close\fi
}{%
  \if\relax\NAT@date\relax\else\NAT@@close\fi
  \if*#2*\else\textsuperscript{#2}\fi
}
%    \end{macrocode}
%
% Author-year 模式的 \cs{citep} 的页码：
%    \begin{macrocode}
\renewcommand\NAT@cite%
    [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
        #1\NAT@@close\if*#3*\else\textsuperscript{#3}\fi\else#1\fi\endgroup}
%    \end{macrocode}
%
% 在顺序编码制下，\pkg{natbib} 只有在三个以上连续文献引用才会使用连接号，
% 这里修改为允许两个引用使用连接号。
% \footnote{\url{https://tex.stackexchange.com/a/86991/82731}}
%    \begin{macrocode}
\ustc@patchcmd{\NAT@citexnum}{%
  \ifx\NAT@last@yr\relax
    \def@NAT@last@yr{\@citea}%
  \else
    \def@NAT@last@yr{--\NAT@penalty}%
  \fi
}{%
  \def@NAT@last@yr{-\NAT@penalty}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{thebibliography}
% 参考文献列表格式：宋体 10.5 磅，行距 20 磅，续行缩进两字，左对齐。
% 本科生依然是小四宋体。
%    \begin{macrocode}
\ifustc@degree@graduate
  \renewcommand\bibfont{\fontsize{10.5\bp@}{20\bp@}\selectfont}
\fi
\setlength{\bibsep}{0\p@ \@plus.2\p@}
\setlength{\bibhang}{2\ccwd}
\renewcommand\@biblabel[1]{[#1]\hfill}
%    \end{macrocode}
%
% 为了将参考文献加入目录和 pdf 书签，重新定义 \pkg{natbib} 的 \cmd{bibsection}
%    \begin{macrocode}
\renewcommand\bibsection{%
  \@mainmatterfalse
  \chapter{\bibname}%
}
%    \end{macrocode}
% \end{environment}
%
% BibTeX 生成参考文献表的样式在 \file{bst} 文件中提供。
%
%
% \subsection{附录}
%
% \begin{environment}{acknowledgements}
% 定义了一个满足要求的致谢环境：
%    \begin{macrocode}
\newenvironment{acknowledgements}{%
  \ifustc@degree@graduate
    \chapter{\ustc@acknowledgements@name}%
  \else
    \ustc@chapter{\ustc@acknowledgements@name}%
    \ifustc@tocloaded
      本科生需要手动将致谢置于目录前。\par
    \fi
  \fi
}{}
%
%    \end{macrocode}
%
% 兼容旧版本中“acknowledgments”的拼法。
%    \begin{macrocode}
% Reserved for compatibility until 2020-07-01.
\newenvironment{acknowledgments}{%
  \begin{acknowledgements}%
}{%
  \end{acknowledgements}%
}
%    \end{macrocode}
% \end{environment}
%
% \begin{environment}{publications}
% 发表成果环境：
%    \begin{macrocode}
\newenvironment{publications}{\chapter{\ustc@publication@name}}{}
%    \end{macrocode}
% \end{environment}
%
%
% \subsection{其他宏包的设置}
%
% 这些宏包并非格式要求，但是为了方便同学们使用，在这里进行简单设置。
%
%
% \subsubsection{\pkg{hyperref} 宏包}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{hyperref}{
  \hypersetup{
    bookmarksnumbered  = true,
    bookmarksopen      = true,
    bookmarksopenlevel = 1,
    linktoc            = all,
    unicode            = true,
    psdextra           = true,
  }
%    \end{macrocode}
%
% 如果为 \opt{pdf} 样式，设置 hyperlink 颜色
%    \begin{macrocode}
  \ifustc@output@electronic
    \hypersetup{
      colorlinks = true,
      allcolors  = blue,
    }
  \else
    \hypersetup{hidelinks}
  \fi
%    \end{macrocode}
%
% 填写 PDF 元信息。
%    \begin{macrocode}
  \AtBeginDocument{%
    \ifustc@language@chinese
      \hypersetup{
        pdftitle  = \ustc@title,
        pdfauthor = \ustc@author,
      }%
    \else
      \hypersetup{
        pdftitle  = \ustc@title@en,
        pdfauthor = \ustc@author@en,
      }%
    \fi
  }
%    \end{macrocode}
%
% 添加 PDF 书签
%
%    \begin{macrocode}
  \newcounter{ustc@bookmarknumber}
  \renewcommand\ustc@pdfbookmark[1]{%
    \phantomsection
    \stepcounter{ustc@bookmarknumber}%
    \pdfbookmark[0]{#1}{ustcchapter.\theustc@bookmarknumber}%
  }
%    \end{macrocode}
%
% 在 PDF 字符串中去掉换行，以减少 \pkg{hyperref} 的警告信息。
%    \begin{macrocode}
  \pdfstringdefDisableCommands{
    \let\\\@empty
    \let\hspace\@gobble
  }
%    \end{macrocode}
%
% \pkg{hyperref} 与 \pkg{unicode-math} 存在一些兼容性问题，见
% \href{https://github.com/ustctug/ustcthesis/issues/223}{%
%   ustctug/ustcthesis\#223}，
% \href{https://github.com/ho-tex/hyperref/pull/90}{ho-tex/hyperref\#90} 和
% \href{https://github.com/ustctug/ustcthesis/issues/235}{%
%   ustctug/ustcthesis/\#235}。
%    \begin{macrocode}
  \@ifpackagelater{hyperref}{2019/04/27}{}{%
    \g@addto@macro\psdmapshortnames{\let\mu\textmu}%
  }
%    \end{macrocode}
%
% 设置中文的 \cs{autoref}。
% \footnote{\url{https://tex.stackexchange.com/a/66150/82731}}
%    \begin{macrocode}
  \ifustc@language@chinese
    \def\equationautorefname~#1\null{公式~(#1)\null}
    \def\footnoteautorefname{脚注}
    \def\itemautorefname~#1\null{第~#1~项\null}
    \def\figureautorefname{图}
    \def\tableautorefname{表}
    \def\partautorefname~#1\null{第~#1~部分\null}
    \def\appendixautorefname{附录}
    \def\chapterautorefname~#1\null{第~#1~章\null}
    \def\sectionautorefname~#1\null{第~#1~节\null}
    \def\subsectionautorefname~#1\null{第~#1~小节\null}
    \def\subsubsectionautorefname~#1\null{第~#1~小小节\null}
    \def\paragraphautorefname~#1\null{第~#1~段\null}
    \def\subparagraphautorefname~#1\null{第~#1~小段\null}
    \def\theoremautorefname{定理}
    \def\HyRef@autopageref#1{\hyperref[{#1}]{第~\pageref*{#1} 页}}
  \fi
}
%    \end{macrocode}
%
%
% \subsubsection{\pkg{amsthm} 宏包}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{amsthm}{
  \newtheoremstyle{ustcplain}
    {}{}
    {}{2\ccwd}
    {\bfseries}{}
    {\ccwd}{}
  \theoremstyle{ustcplain}
%    \end{macrocode}
% 定义新的定理
%    \begin{macrocode}
  \ifustc@language@chinese
    \newcommand\ustc@assertion@name{断言}
    \newcommand\ustc@assumption@name{假设}
    \newcommand\ustc@axiom@name{公理}
    \newcommand\ustc@corollary@name{推论}
    \newcommand\ustc@definition@name{定义}
    \newcommand\ustc@example@name{例}
    \newcommand\ustc@lemma@name{引理}
    \newcommand\ustc@proof@name{证明}
    \newcommand\ustc@proposition@name{命题}
    \newcommand\ustc@remark@name{注}
    \newcommand\ustc@theorem@name{定理}
  \else
    \newcommand\ustc@assertion@name{Assertion}
    \newcommand\ustc@assumption@name{Assumption}
    \newcommand\ustc@axiom@name{Axiom}
    \newcommand\ustc@corollary@name{Corollary}
    \newcommand\ustc@definition@name{Definition}
    \newcommand\ustc@example@name{Example}
    \newcommand\ustc@lemma@name{Lemma}
    \newcommand\ustc@proof@name{Proof}
    \newcommand\ustc@proposition@name{Proposition}
    \newcommand\ustc@remark@name{Remark}
    \newcommand\ustc@theorem@name{Theorem}
  \fi
  \newtheorem{theorem}             {\ustc@theorem@name}    [chapter]
  \newtheorem{assertion}  [theorem]{\ustc@assertion@name}
  \newtheorem{axiom}      [theorem]{\ustc@axiom@name}
  \newtheorem{corollary}  [theorem]{\ustc@corollary@name}
  \newtheorem{lemma}      [theorem]{\ustc@lemma@name}
  \newtheorem{proposition}[theorem]{\ustc@proposition@name}
  \newtheorem{assumption}          {\ustc@assumption@name} [chapter]
  \newtheorem{definition}          {\ustc@definition@name} [chapter]
  \newtheorem{example}             {\ustc@example@name}    [chapter]
  \newtheorem*{remark}             {\ustc@remark@name}
%    \end{macrocode}
% \pkg{amsthm} 单独定义了 proof 环境，这里重新定义以满足格式要求。
% 原本模仿 \pkg{amsthm} 写成 |\item[\hskip\labelsep\hskip2\ccwd #1\hskip\ccwd]|，
% 但是却会多出一些间隙。
%    \begin{macrocode}
  \renewenvironment{proof}[1][\ustc@proof@name]{\par
    \pushQED{\qed}%
    \normalfont \topsep6\p@\@plus6\p@\relax
    \trivlist
      \item\relax\hskip2\ccwd
      \textbf{#1}
      \hskip\ccwd\ignorespaces
    }{%
    \popQED\endtrivlist\@endpefalse
  }
}
%    \end{macrocode}
%
%
% \subsubsection{\pkg{algorithm2e} 宏包}
%
% 按章节编号。
%    \begin{macrocode}
\PassOptionsToPackage{algochapter}{algorithm2e}
%    \end{macrocode}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{algorithm2e}{
  \ifustc@language@chinese
    \SetAlgorithmName{算法}{算法}{算法清单}
  \else
    \SetAlgorithmName{Algorithm}{Algorithm}{List of Algorithms}
  \fi
%    \end{macrocode}
%
% 设置算法环境的格式。
%    \begin{macrocode}
  \SetAlCapSkip{6\bp@}
  \SetAlCapFnt{\small}
  \SetAlCapNameFnt{\small}
  \ifustc@degree@graduate
    \SetAlCapNameSty{textbf}
  \fi
  \SetAlgoCaptionSeparator{\unskip\hspace*{\ccwd}}
%    \end{macrocode}
%
% 设置算法清单的格式
%    \begin{macrocode}
  \renewcommand\listofalgocfs{%
    \ifustc@degree@graduate
      \cleardoublepage
    \fi
    \ustc@chapter{\listalgorithmcfname}%
    \@starttoc{loa}%
  }
  \titlecontents{algocf}
    [2.3em]{\normalsize}
    {\contentslabel{2.3em}}{}
    {\ustc@leaders\contentspage}
  \contentsuse{algocf}{loa}
}
%    \end{macrocode}
%
%
% \subsubsection{\pkg{nomencl} 宏包}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{nomencl}{
  \let\nomname\ustc@notation@name
  \def\thenomenclature{%
    \ifustc@degree@graduate
      \cleardoublepage
      \pagestyle{headings}%
    \fi
    \ustc@chapter{\ustc@notation@name}%
    \nompreamble
    \list{}{%
      \labelwidth\nom@tempdim
      \leftmargin\labelwidth
      \advance\leftmargin\labelsep
      \itemsep\nomitemsep
      \let\makelabel\nomlabel}}
  \def\endthenomenclature{%
    \endlist
    \nompostamble
    \ifustc@degree@graduate
      \clearpage
      \pagestyle{plain}%
    \fi
  }
}
%    \end{macrocode}
%
%
% \subsubsection{\pkg{siunitx} 宏包}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{siunitx}{
  \sisetup{
    group-minimum-digits = 4,
    separate-uncertainty = true,
    inter-unit-product   = \ensuremath{{}\cdot{}},
  }
  \ifustc@language@chinese
    \sisetup{
      list-final-separator = { 和 },
      list-pair-separator  = { 和 },
      range-phrase         = {～},
    }
  \fi
}
%    \end{macrocode}
%
% \subsubsection{\pkg{chapterbib} 宏包}
%
%    \begin{macrocode}
\AtEndOfPackageFile*{chapterbib}{
  \renewcommand\bibsection{%
    \ctexset{section/numbering=false}%
    \section{\bibname}%
    \ctexset{section/numbering=true}%
  }
}
%    \end{macrocode}
%
% \Finale
\endinput
